繁体   English   中英

Lambda表达式,用于使用表达式查询KeyValuePairs数组 <Func<T, bool> &gt;

[英]Lambda expression for querying an array of KeyValuePairs using Expression<Func<T, bool>>

我有一个像这样的KeyValuePairs数组:

KeyValuePair<long,int>[] orderItems;

此KeyValuePair的'long'组件对应于数据库表上的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支持'Any'子句。 但是,如果不使用long数组,我仍然无法使它正常工作。 对任何聪明的人都表示感谢,他们给出了不需要我先从KeyValuePair提取“键”值到数组中的解决方案。

如果我使用密钥,任何人都会收到以下异常:

“无法创建类型'System.Collections.Generic.IEnumerable`1'的常量值。在这种情况下,仅支持基本类型(例如Int32,String和Guid)。

尝试这个:

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

在这种情况下,让EF与数据库一起使用时很难使用GetMany-Method。 但是您应该有一个以您的实体命名的查询对象-我在这里以类别(作为具有字段/属性ID的类型的可查询对象)为例。 然后,您可以执行以下操作:

var query = context.Categories;
foreach(var pair in orderedItems)
  query = query.Union(context.Where(categorie => categorie.Id = pair.Key));

最后使用查询:

var results = query.ToList();

PS:要将其与您的存储库模式一起使用,您只需在存储库接口中将此queryable-Collection公开为IQueryable(或从通用存储库(例如ICategoryRepository)创建继承的接口)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM