我有一个KeyValuePairs数组,如下所示:
KeyValuePair<long,int>[] orderItems;
此KeyValuePair的“long”组件对应于数据库表上的Id(主键)值。
使用Entity Framework,我定义了一个存储库,它在其接口上提供以下方法:
IEnumerable<T> GetMany(Expression<Func<T, bool>> where);
上面的存储库方法允许我使用lambda表达式查询数据库。例如,如果我想查询数据库中“类别”列等于“相机”的所有行,我可以这样说:
var results = repository.GetMany(a => a.Category.Contains("Cameras")).ToList();
我想要查询的是所有行,其中Id(主键)等于KeyValuePairs数组中任何元素的Key值。因此,如果KeyValuePairs列表是产品ID及其数量的列表,我只想查询数据库中所有ID在我的数组中的产品。
任何人都可以冒险使用适当的lambda表达式吗?
* *编辑为原始
建议使用:
var results = repository.GetMany(a => keys.Any(x => x == a.Id)).ToList();
是一个很好的,如果我首先从KeyValuePair数组创建一个键数组,它将起作用。所以像这样:
long[] pids = new long[orderItems.Length];
for (int i = 0; i < orderItems.Length; i++ )
{
pids[0] = orderItems[i].Key;
}
var products = productRepository.GetMany(a => pids.Any(x => x == a.Id)).ToList();
这表明EF支持'Any'子句。如果不使用longs数组,我仍然无法使用它。感谢任何聪明的人提供的解决方案,不要求我先将KeyValuePair中的'key'值提取到数组中。
如果我使用密钥。我得到以下异常:
“无法创建类型'System.Collections.Generic.IEnumerable`1'的常量值。在此上下文中仅支持基本类型(例如Int32,String和Guid)”
答案 0 :(得分:2)
试试这个:
var keys = orderItems.Select(x => x.Key).ToList();
var results = repository.GetMany(a => keys.Any(x => x == a.Id))
.ToList();
答案 1 :(得分:1)
在使用EF时,很难使用GetMany-Method,在这种情况下,它可以使用数据库。 但是你应该有一个以你的实体命名的query-Object - 我把这里的类别(作为一个带有字段/属性Id的Type的可查询对象)作为例子。然后你可以这样做:
var query = context.Categories;
foreach(var pair in orderedItems)
query = query.Union(context.Where(categorie => categorie.Id = pair.Key));
最后使用查询:
var results = query.ToList();
PS:要将其与您的存储库模式一起使用,您只需在存储库接口中将此可查询集合公开为IQueryable(或从您的通用存储库创建一个继承的接口,例如ICategoryRepository)