2010-10-03 2 views
9

J'essaie d'obtenir la requête LINQ suivante pour travailler contre la base de données (3.5 SP1):Entity Framework BuildContainsExpression provoque une erreur de fournisseur de données .NET Framework interne 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(); 

Une fois que j'ajoute Where(LinqTools.BuildContainsExpression<Billing.Customer, int>(u => u.LabelId, labelIds)) je reçois le texte suivant exception:

System.InvalidOperationException: .NET Framework erreur interne du fournisseur de données 1025.

Si je retire Where(LinqTools.BuildContainsExpression<Billing.Customer, int>(u => u.LabelId, labelIds)) tout est bon.

Toute aide sera appréciée.

Merci, Nir.

Répondre

11

Essayez:

 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(); 

Vous voulez que le résultat dans la requête, et non pas l'appel à LinqTools.BuildContainsExpression lui-même.

+0

Ça y est! Merci beaucoup! – nirpi

+2

Oh, votre génie! J'ai ouvert une prime sur une [question similaire] (http://stackoverflow.com/q/11990158/7850) il y a juste une heure, et seulement plus tard j'ai trouvé votre réponse. S'il vous plaît, allez-y et obtenez une prime là-bas. –

+0

Cela semble évident, mais vous avez raison, l'expression doit être construite en dehors de la requête elle-même. –

Questions connexes