用于使用表达式<func <t,bool =“”>&gt; </func <t,>查询KeyValuePairs数组的Lambda表达式

时间:2011-09-02 10:53:53

标签: c# entity-framework lambda

我有一个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)”

2 个答案:

答案 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)

相关问题