2011-09-02 95 views
0

我有KeyValuePairs的一个这样的数组:Lambda表达式用于查询使用表达式KeyValuePairs的阵列<Func键<T, bool>>

KeyValuePair<long,int>[] orderItems; 

此KeyValuePair的“长”分量对应于一个Id(主键)值在数据库表上。

使用实体框架,我已经定义了一个储存库,其提供其接口上的方法如下:

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支持。尽管如此,如果不使用long数组,我仍然无法工作。对任何足够聪明的人都可以提供一个解决方案,而不需要我先将KeyValuePair中的'key'值提取到数组中。

如果我使用keys.Any我得到下面的异常:

“无法创建类型的常量值‘System.Collections.Generic.IEnumerable`1’只有原始类型(如的Int32,字符串和Guid)在这种情况下是受支持的“

回答

1

在这种情况下,使用EF执行GetMany方法时很难使用GetMany方法。 但是你应该有一个查询 - 以你的实体命名的对象 - 我在这里把类别(作为一个带有字段/属性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)

1

做出继承接口试试这个:

var keys = orderItems.Select(x => x.Key).ToList(); 
var results = repository.GetMany(a => keys.Any(x => x == a.Id)) 
         .ToList(); 
+0

EF转换任何?如果肯定是更好的解决方案 - 我的appologies。 – Carsten

+0

@Coenoen:我认为它确实存在,但我不确定。 OP需要测试它。 –

+0

这将是伟大的 - 我有/我的疑惑,因为你可以在那里有很多恶作剧,我只是不知道EF走的表达式多深深检查和翻译 – Carsten

相关问题