Как запросить несколько объектов одновременно? - PullRequest
3 голосов
/ 19 марта 2009

Я пытаюсь запросить сущность, чтобы вернуть несколько строк на основе фильтра.

Например, в SQL мы имеем:

SELECT * FROM table WHERE field IN (1, 2, 3)

Как мне сделать это в LINQ to Entities?

Ответы [ 3 ]

4 голосов
/ 20 марта 2009

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

Мне приходилось продолжать поиск, пока в конце концов я не нашел способ сделать то, что мне нужно, в посте Фредерика Оуэллета на Форумы Microsoft .

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

    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);
    }
3 голосов
/ 19 марта 2009

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

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

var myProducts = from p in db.Products
                 where productList.Contains(p.ProductID)
                select p;
1 голос
/ 19 марта 2009

Это точное представление вашего запроса в 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...