2011-02-10 16 views
5

Witam, czy mogę wiedzieć, jak wybrać warunek "case" przy korzystaniu z linq? Skomentowany kod to moje pytanie. jak umieścić tam warunek? mój kod:Łączenie linq z warunkiem przypadku

var r = from u in Users 
    join p in Payments on u.Id equals p.UserId 
    join soi in SaleOrderItems on p.ReferenceId equals soi.Id 
      //if soi.InventoryTypeId == 1 
       //then join i in Inventories on soi.InventoryOrCourseId equals i.Id 
      //elseif soi.InventorytypeId ==2 
       //then join c in Courses on soi.InventoryOrCourseId equals c.Id 
    where u.Id == 5 
    select new{ u, p, soi, either i or c}; 

Odpowiedz

2

musiał użyć jakiegoś sprzężenia zewnętrznego trik do osiągnięcia tego celu, jedna prosta metoda jest poprzez DefaultIfEmpty(). Zasadniczo utworzyć sprzężenie wewnętrzne następnie rozwiń ją z brakujących rzędów:

var r = from u in Users 
    join p in Payments on u.Id equals p.UserId 
    join soi in SaleOrderItems on p.ReferenceId equals soi.Id 
    join i in Inventories on new {a = soi.InventoryTypeId, b = soi.InventoryOrCourseId } equals new {a = 1, b = i.Id} into g1 
    from oi in g1.DefaultIfEmpty() 
    join c in Courses on new {a = soi.InventoryTypeId, b = soi.InventoryOrCourseId } equals new {a = 2, b = c.Id} into g2 
    from oc in g2.DefaultIfEmpty() 
    where u.Id == 5 
    select new{ u, p, soi, ic = oi ?? oc}; 

uważać na to ostatnie stwierdzenie ic = oi ?? oc, ponieważ typy różnią anonimowy typ użyje deklarację System.Object więc może pomieścić oba typy, jeśli chcą używać silnej, typowej obsługi, może lepszym rozwiązaniem byłoby zwrócić zarówno oc, jak i ic, a następnie przetestować. Powinieneś najlepiej zdecydować, na podstawie tego, w jaki sposób korzystasz z tego zapytania w późnym ronie.

+0

@mmix hi otrzymałem ten błąd "Typ jednego z wyrażeń w klauzuli join jest niepoprawny Typ Wnioskowanie nie powiodło się w wywołaniu" GroupJoin "." na linii dołącz i in Inventories na nowy {a ... – VeecoTech

+0

Jakiego typu jest 'soi.InventoryTypeId'? Ponieważ wyobrażam sobie, że 'type (soi.InventoryOrCourseId)' jest równy 'type (Inventory.Id)', to musi to oznaczać, że 'soi.InventoryTypeId' nie jest' int'. Jeśli tak, udekoruj stałe 1 i 2 odpowiednim sufiksem (U, L, itd.) – mmix

+0

@mmix: tak, oba są dokładnie int – VeecoTech

Powiązane problemy