【发布时间】:2012-04-10 14:01:03
【问题描述】:
使用以下示例,我想在我的 Contains 方法中使用我的 Expression,让它使用 EF 将查询传递到 sql server。
我怎样才能让它正常工作?
void Main()
{
IQueryable<Person> qry = GetQueryableItemsFromDB();
var filtered = qry.Filter(p=>p.CompanyId);
}
public static class Ext
{
public static IQueryable<T> Filter<T>(this IQueryable<T> items, Expression<Func<T, int>> resolveCompanyIdExpression)
{
IEnumerable<int> validComps = GetCompanyIdsFromDataBase();
var exp = Expression.Lambda<Func<T, bool>>(
Expression.Call(typeof(Queryable),"Contains", new[] { typeof(Company) },
Expression.Constant(validComps),
resolveCompanyIdExpression.Body),
resolveCompanyIdExpression.Parameters[0]);
return items.Where(exp);
}
public static IQueryable<T> Filter<T>(this IQueryable<T> items, Expression<Func<T, IEnumerable<int>>> resolveCompanyIdExpression)
{
IEnumerable<int> validComps = GetCompanyIdsFromDataBase();
//No Idea what to do here ?
}
}
public class Person
{
public int CompanyId {get;set;}
}
我知道我可以传入整个谓词,但我只希望用户提供如何从相关实体解析 Company。
更新
我决定解析 companyId 而不是整个公司实体,我可以获取内存中的 ids 列表,如果它是 IQueryable 或只是一个普通数组/IEnumerable,我不会大惊小怪
但是我得到了一些奇怪的错误:
'执行过程中发生异常 Extent.Select(o => o).Where(p => (p.Hide = False)).Where(p => (p.Archived = False)).Where(item => System.Int32[].Contains(item.Development.CompanyId))'。看 InnerException 了解更多详情。
内部异常是
参数表达式无效
更新 2
我已经编辑了代码以反映我真正想做的事情,但在找到解决方案时运气不佳。
【问题讨论】:
-
即使您按照自己的方式使用它,您也会为列表中的每个项目执行单独的往返,因为您的查询基于对象列表。您需要将查询更改为以
validComps开头,或者从数据库中获取IQueryable<T>并从那里开始。您还需要将“包含”基于对象的唯一 ID,而不是整个对象。 -
好吧,这是我的错字,应该是
IQueryable<T>
标签: c# .net linq lambda linq-expressions