2016-02-13 21 views
6

Używam struktury encji i robię grupę przez tabelę. Moje zapytanie jest następujące: -Grupa Linq Nie przyjmując jednostki wewnętrznej

var brokerPaymentLists = dbContext.BrokerPayments 
    .Include("PaymentDetail") 
    .Where(bp => bp.IdPaymentStatus == (long)EntityModel.Additions.Variables.PaymentStatus.ALLOTED) 
    .GroupBy(bp => bp.IdBroker, 
    (key, g) => new 
    { 
     IdBroker = key.Value, 
     BrokerPayments = g.ToList() 
    }).ToList(); 

mam włączone PaymentDetail ale po grupowanie przez widzę że paymentdetail dla każdej pozycji w BrokerPayments i null. Wszelkie sugestie, dlaczego tak jest, jak również mogę zrobić grupę przez takie, że mogę mój my paymentDetail insisde każdego z BrokerPayments;

+0

znalazłem blogu, że może pomóc, choć został napisany w 2008 roku, więc może być nieaktualny: http://wildermuth.com/2008/12/28/Caution_when_Eager_Loading_in_the_Entity_Framework – devuxer

Odpowiedz

1

Ładowanie przy użyciu Include wymaga, aby kształt danych nie był zmieniany po zastosowaniu Include. W twoim przypadku oznacza to, że zapytanie musi wrócić IQueryable<BrokerPayments>. Ale operator GroupBy zmienia kształt, ponieważ zwraca IQueryable<IGrouping<TKey, TSource>>. To samo stanie się z projekcjami i niestandardowymi połączeniami.

Jako obejście można wykonać grupowanie w LINQ do obiektów takich jak:

var brokerPaymentLists = dbContext.BrokerPayments 
    .Include("PaymentDetail") 
    .Where(bp => bp.IdPaymentStatus == (long)EntityModel.Additions.Variables.PaymentStatus.ALLOTED) 
    .AsEnumerable() 
    .GroupBy(bp => bp.IdBroker, 
    (key, g) => new 
    { 
     IdBroker = key.Value, 
     BrokerPayments = g 
    }); 

UWAGA: zwróć uwagę, że exectuion zapytanie nie będzie defferd

+0

Nie używaj 'ToList()', przynajmniej podczas próby konwersji na zapytanie Linq do obiektu, użyj 'AsEnumerable()'. –

+0

@Jeff masz całkowicie rację. Poprawiłem moją odpowiedź. – Kalitsov

Powiązane problemy