2010-10-03 13 views
9

Estoy tratando de obtener la siguiente consulta LINQ a trabajar en contra de la base de datos (3.5 SP1):Entity Framework .NET BuildContainsExpression Causas de datos interna Marco de error Proveedor 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(); 

Una vez añado Where(LinqTools.BuildContainsExpression<Billing.Customer, int>(u => u.LabelId, labelIds)) me sale el siguiente excepción:

System.InvalidOperationException: error del proveedor de datos .NET interna Marco 1025.

Si quito Where(LinqTools.BuildContainsExpression<Billing.Customer, int>(u => u.LabelId, labelIds)) todo está bien.

Cualquier ayuda será apreciada.

Gracias, Nir.

Respuesta

11

Probar:

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

queremos el resultado en la consulta, no la llamada a LinqTools.BuildContainsExpression sí.

+0

¡Eso lo hace! ¡Muchas gracias! – nirpi

+2

¡Oh, genio! Abrí una recompensa por una [pregunta similar] (http://stackoverflow.com/q/11990158/7850) hace solo una hora, y solo después encontré tu respuesta. Por favor, ve y consigue una recompensa por allí. –

+0

Parece obvio, pero tiene razón, la expresión debe construirse fuera de la consulta en sí. –

Cuestiones relacionadas