2009-03-19 7 views

ответ

4

Хотя я получил некоторые ответы на приглашение, и я благодарю вас за это. Метод, показанный на полученных ответах, не работает.

Я должен был продолжать поиск, пока не нашел способ сделать то, что мне нужно, в сообщении от Фредерика Уэлле в Microsoft Forums.

Короче говоря, это метод расширения ниже:

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

Это точное представление запроса, который у вас есть в SQL.

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

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

Если бы это были сущности, не могли бы вы описать проблему лучше?

Точную SQL представление будет ...

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

вы могли бы сделать что-то вроде этого:

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

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

+1 для быстрого Writting –

+4

Когда я использую этот метод я получаю следующее сообщение об ошибке: LINQ к Entities не распознает метод «Содержит Boolean [ Int32] (System.Collections.Generic.IEnumerable1) [System.Int32], Int32), и этот метод не может быть переведен в выражение хранилища –

Смежные вопросы