2015-12-17 14 views
5

chcę lewo przyłączyć dwie tabele i podsumować jedno pole więc zrobiłem to zapytanie:Używanie LINQ LEFT JOIN z wieloma warunkami i podzapytania

IQueryable<Reference.Inventory.SearchDetailRequester> _qRequester = 
    from a in dbErp.EPROC_TR_ER_DETAIL 
    join b in dbErp.EPROC_TR_INVENTORY on 
    new Reference.Inventory.SearchDetailRequester { ID_REQUEST = a.ID_REQUEST , ID_KATALOG = a.ID_KATALOG} 
    equals 
    new Reference.Inventory.SearchDetailRequester { ID_REQUEST = b.ID_REQUEST, ID_KATALOG = b.ID_KATALOG } 
    into inv_join 
    from c in inv_join.DefaultIfEmpty() 
    where a.ID_REQUEST == ID_REQUEST && a.APROVE_BY_DS == 1 && a.APROVE_BY_GS == 1 

    select new Reference.Inventory.SearchDetailRequester 
    { 
     ID_KATALOG = a.ID_KATALOG, 
     TYPE_OF_GGS = a.TYPE_OF_GGS, 
     TRANSACTION_TYPE = "OUT", 
     DATE = c.DATE ?? "", 
     QTY = -1 * c.QTY ?? a.QTY, 
     ID_INVENTORY = c.ID_INVENTORY, 
     QTY_AVAILABLE = ((from d in dbErp.EPROC_TR_INVENTORY 
          where d.ID_KATALOG == a.ID_KATALOG 
          group d by new { d.ID_KATALOG } into e 
          select new { qty_ava = (System.Int32)e.Sum(p => p.QTY ?? 0) }).FirstOrDefault().qty_ava) 
    }; 

ale kiedy debugowania mam komunikat:

Typ "Reference.Inventory.SearchDetailRequester" pojawia się w dwóch niekompatybilnych strukturalnie inicjacjach w ramach pojedynczego zapytania LINQ do Entities. Typ można zainicjować w dwóch miejscach w tym samym zapytaniu, ale tylko wtedy, gdy te same właściwości są ustawione w obu miejscach i te właściwości są ustawione w tej samej kolejności.

Czy ktoś może pomóc?

Odpowiedz

3

Trzeba do łączenia z anonimowego typu, nie sądzę, można wybrać klasę jak ty:

new { ID_REQUEST = a.ID_REQUEST , ID_KATALOG = a.ID_KATALOG} 
equals 
new { ID_REQUEST = b.ID_REQUEST, ID_KATALOG = b.ID_KATALOG } 

Jeśli na przykład b.ID_KATALOG jest pustych w bazie danych, można go rozwiązać jak to:

new { ID_REQUEST = a.ID_REQUEST , ID_KATALOG = a.ID_KATALOG} 
equals 
new { ID_REQUEST = b.ID_REQUEST, ID_KATALOG = (int)b.ID_KATALOG } 

to przy założeniu ID_KATALOG jest int oczywiście. Albo można zrobić to na odwrót zbyt normalnie:

new { ID_REQUEST = a.ID_REQUEST , ID_KATALOG = (int?)a.ID_KATALOG} 
equals 
new { ID_REQUEST = b.ID_REQUEST, ID_KATALOG = b.ID_KATALOG } 
+0

nie działa .net błąd odczytu z tej wiadomości: korpus zapytanie musi skończyć z klauzuli SELECT lub klauzuli grupowej – Karl

+0

nadal nie działa z tym messge : Typ jednego z wyrażeń w klauzuli join jest niepoprawny. Wnioskowanie typu nie powiodło się w wywołaniu "GroupJoin". – Karl

+0

Czy jedna z właściwości w anonimowym typie nullable dla b, ale nie dla a? (int? ID_Request dla! = int ID_Request dla b, nawet jeśli są one takie same w db) –