フィルターに基づいて複数の行を返すようにエンティティをクエリしようとしています。
たとえば、SQL には次のようなものがあります。
SELECT * FROM table WHERE field IN (1, 2, 3)
LINQ to Entities でそれを行うにはどうすればよいですか?
フィルターに基づいて複数の行を返すようにエンティティをクエリしようとしています。
たとえば、SQL には次のようなものがあります。
SELECT * FROM table WHERE field IN (1, 2, 3)
LINQ to Entities でそれを行うにはどうすればよいですか?
私はいくつかの迅速な回答を受け取りましたが、ありがとうございました。私が受け取った返信に示されている方法は機能しませんでした。
Microsoft Forumsの Frederic Ouellet の投稿で、最終的に必要なことを行う方法が見つかるまで、検索を続けなければなりませんでした。
要するに、以下の拡張メソッドです。
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);
}
次のようなことができます。
int[] productList = new int[] { 1, 2, 3, 4 };
var myProducts = from p in db.Products
where productList.Contains(p.ProductID)
select p;
これは、SQL でのクエリの正確な表現です。
int[] productList = 新しい 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)