2009-03-19 5 views

Répondre

4

Bien que je ne ai reçu des réponses rapides, et je vous remercie tous pour cela. La méthode montrée sur les réponses que j'ai n'a pas fonctionné.

J'ai dû continuer à chercher jusqu'à ce que je trouve finalement un moyen de faire ce dont j'avais besoin dans un message de Frédéric Ouellet au Microsoft Forums.

En bref, il est la méthode d'extension ci-dessous:

public static IQueryable<T> WhereIn<T, TValue>(this IQueryable<T> source, Expression<Func<T, TValue>> propertySelector, params TValue[] values) 
    { 
     return source.Where(GetWhereInExpression(propertySelector, values)); 
    } 

    public static IQueryable<T> WhereIn<T, TValue>(this IQueryable<T> source, Expression<Func<T, TValue>> propertySelector, IEnumerable<TValue> values) 
    { 
     return source.Where(GetWhereInExpression(propertySelector, values)); 
    } 

    private static Expression<Func<T, bool>> GetWhereInExpression<T, TValue>(Expression<Func<T, TValue>> propertySelector, IEnumerable<TValue> values) 
    { 
     ParameterExpression p = propertySelector.Parameters.Single(); 
     if (!values.Any()) 
      return e => false; 

     var equals = values.Select(value => (Expression)Expression.Equal(propertySelector.Body, Expression.Constant(value, typeof(TValue)))); 
     var body = equals.Aggregate<Expression>((accumulate, equal) => Expression.Or(accumulate, equal)); 

     return Expression.Lambda<Func<T, bool>>(body, p); 
    } 
1

Ceci est une représentation exacte de la requête que vous avez dans SQL.

int [] productList = new int [] {1, 2, 3};

var myProducts = from p in db.Products 
       where productList.Contains(p.ProductID) 
       select p; 

S'il s'agissait d'entités, pourriez-vous décrire le problème mieux?

La représentation exacte SQL serait ...

SELECT [t0].[ProductID], [t0].[Name], [t0].[ProductNumber], [t0].[MakeFlag], [t0].[FinishedGoodsFlag], 
[t0].[Color], [t0].[SafetyStockLevel], [t0].[ReorderPoint], [t0].[StandardCost], [t0].[ListPrice], 
[t0].[Size], [t0].[SizeUnitMeasureCode], [t0].[WeightUnitMeasureCode], [t0].[Weight], [t0].[DaysToManufacture], 
[t0].[ProductLine], [t0].[Class], [t0].[Style], [t0].[ProductSubcategoryID], [t0].[ProductModelID], 
[t0].[SellStartDate], [t0].[SellEndDate], [t0].[DiscontinuedDate], [t0].[rowguid], [t0].[ModifiedDate] 
FROM [Production].[Product] AS [t0] 
WHERE [t0].[ProductID] IN (@p0, @p1, @p2, @p3) 
3

vous pourriez faire quelque chose comme ceci:

int[] productList = new int[] { 1, 2, 3, 4 }; 

var myProducts = from p in db.Products 
       where productList.Contains(p.ProductID) 
       select p; 
+0

+1 pour la writting rapide –

+4

Quand j'utilise cette méthode que je reçois l'erreur suivante: LINQ to Entities ne reconnaît pas la méthode « Boolean Contient [ Int32] (System.Collections.Generic.IEnumerable'1 [System.Int32], Int32) 'méthode, et cette méthode ne peut pas être traduite dans une expression de magasin –