[Linq2Sql] Concat z lokalna sekwencja

0

moze czesc zna ten blad :/
Local sequence cannot be used in LINQ to SQL implementation of query operators except the Contains() operator

teraz jak go ominac?
chce sekwencje z bazy polaczyc z jakas lista (nawet z jednym dodatkowym wierszem)

czyli chcialbym zeby wygenerowal sie kod sql:

select Id,Name from MyTab
union all
select 0,'Default'
0

co powiecie na cos takiego? :D

(from x in Tab1
select new {Name=x.Name, Rate=x.Rate}).Concat(
from x in Tab1.Take(1)
select new {Name="Default", Rate=x.Rate/x.Rate}
)

generalnie co chce osiagnac, to do wyniku query dodac wiersz z jakac powiedzmy defaultowa nazwa i polem decimal o wartosci 1.0 (pole Rate)
mam pewnosc ze cos w tej tabeli jest, wiec Take(1) sie nie wywali

dostaje takiego sql:

-- Region Parameters
DECLARE @p0 NVarChar(7) SET @p0 = 'Default'
-- EndRegion
SELECT [t3].[Name], [t3].[Rate]
FROM (
    SELECT [t0].[Name], [t0].[Rate]
    FROM [Tab1] AS [t0]
    UNION ALL
    SELECT @p0 AS [value], [t2].[Rate] / [t2].[Rate] AS [value2]
    FROM (
        SELECT TOP (1) [t1].[Rate]
        FROM [Tab1] AS [t1]
        ) AS [t2]
    ) AS [t3]

z reki napisalbym to inaczej, ale wazny jest wynik

aha, czemu nie chce dodac tego w kodzie, po przeksztalceniu wyniku query np. do listy?
bo ten element bedzie dalej join'owany z innymi query i generalnie calosc ma sie wykonac po stronie sql servera, a nie w kodzie

0
var wynik_plus_jeden = ( from blahblahblah
   blahblahblah
  blahblahblah
  select blahblahblah
)
.ToList() // <- rozwiazanie Twojego problemu
.Concat(new[] { mojdodatkowyobiektwyniku} );

problem w 1'wszej czesci Twojego watku polega na tym, ze LINQ stara sie przetlumaczyc CALE zapytanie na postac SQL'owa do wykonania przez serwer. Stad wynika, ze liste konkretnych wartosci mozna podawac tylko do .Contains() -> bo jedyna skladnia SQL ktora akceptuje wylicznie to operator IN ("where blah in (a,b,c,d,..)") !

tak wiec, Concat() raczej nie jest zepsuty :) a jedyne co musisz zrobic to w pewnym momenciel, uwaga, ladne fraza: sprzęgnąc LinqToSql z LinqToObjects, czyli podpowiedziec providerowi GDZIE zakonczyc budowanie SQL'a -- czyli, banalne .ToList() powodujace wiadomo co.. Wszystko po .ToList() bedzie wykonane na już-sciagnietych obiektach.

Z innej strony patrzac: po co wysylac ekstra wiersze do bazy zeby je dokleila do wynikow? wykonaj zapytanie (->ToList, ToArray...), a potem do wyniku doklej wyniki:)

edit: na drugi problem: to juz gorzej. jezeli to to ma byc JOIN'wane z innymi tablicami, to masz DUŻY problem, z powodu teog co podalem wyzej. LINQ jest to odpalania Select'ow, a Ty potrzebujesz chwilowo dopisac wiersz ew. utworzyc tabele tymczasowa w sesji i ja z joinowac.. na obecne 3 minuty nie widze prostego rozwiazania poza dwoma selektami - raz join, drugi raz select po tyhc-innych-joinowanych-tablicach na podstawie wyliczeina powstalego z tyhc-wierszy-ktore-chciales-dodac, i na koniec juz na obiektach union/concat obu wynikow..

ew. mozesz probowac from X in (Y.Concat(Z)) ale wątpie by dało rade. niestety, Linq to subset SQL'a, nie wszystko da sie zrobic wprost tak samo:|

1 użytkowników online, w tym zalogowanych: 0, gości: 1