2010-10-03 13 views
9

Próbuję uzyskać następujące kwerendy LINQ do pracy z bazą danych (3.5 SP1):Entity Framework BuildContainsExpression Powoduje błąd wewnętrzny Framework dostawcy danych 1025

var labelIds = new List<int> { 1, 2 }; 
var customersAggregatedTransactionsByType = 
    (from transactions in context.TransactionSet 
    from customers in context.CustomerSet 
     .Where(LinqTools.BuildContainsExpression<Billing.Customer, int>(u => u.LabelId, labelIds)) 
    from accounts in context.AccountSet 
    where customers == accounts.Customer 
     && accounts.Id == transactions.Account.Id 
     && transactions.DateTime >= fromDate && transactions.DateTime < toDate 
    group transactions.Amount 
    by new 
    { 
     UserAccountId = transactions.Account.Id, 
     TransactionTypeId = transactions.TransactionTypeId, 
     BaseAssetId = accounts.BaseAssetId 
    } into customerTransactions 
    select customerTransactions).ToList(); 

Gdy dodaję Where(LinqTools.BuildContainsExpression<Billing.Customer, int>(u => u.LabelId, labelIds)) uzyskać następujące wyjątek:

System.InvalidOperationException: błąd wewnętrzny Framework dostawcy danych 1025.

Jeśli usunąć Where(LinqTools.BuildContainsExpression<Billing.Customer, int>(u => u.LabelId, labelIds)) wszystko jest dobrze.

Każda pomoc zostanie doceniona.

Dzięki, Nir.

Odpowiedz

11

Spróbuj:

 var labelIds = new List<int> { 1, 2 }; 
     var exp = LinqTools.BuildContainsExpression<Billing.Customer, int>(u => u.LabelId, labelIds); 
     var customersAggregatedTransactionsByType = 
      (from transactions in context.TransactionSet 
       from customers in context.CustomerSet.Where(exp) 
       from accounts in context.AccountSet 
       where customers == accounts.Customer 
       && accounts.Id == transactions.Account.Id 
       && transactions.DateTime >= fromDate && transactions.DateTime < toDate 
       group transactions.Amount 
       by new 
       { 
        UserAccountId = transactions.Account.Id, 
        TransactionTypeId = transactions.TransactionTypeId, 
        BaseAssetId = accounts.BaseAssetId 
       } into customerTransactions 
       select customerTransactions).ToList(); 

Chcesz wynik w zapytaniu, a nie wezwanie do samego LinqTools.BuildContainsExpression.

+0

To prawda! Wielkie dzięki! – nirpi

+2

Och, geniusz! Otworzyłem nagrodę za [podobne pytanie] (http://stackoverflow.com/q/11990158/7850) zaledwie godzinę temu, a dopiero później znalazłem odpowiedź. Idź i zdobądź tam nagrodę. –

+0

To brzmi oczywiste, ale masz rację, wyrażenie musi być zbudowane poza samym zapytaniem. –