我有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)在这种情况下是受支持的“
EF转换任何?如果肯定是更好的解决方案 - 我的appologies。 – Carsten
@Coenoen:我认为它确实存在,但我不确定。 OP需要测试它。 –
这将是伟大的 - 我有/我的疑惑,因为你可以在那里有很多恶作剧,我只是不知道EF走的表达式多深深检查和翻译 – Carsten