使用以下示例,我想在我的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;}
}
我知道我可以传递整个条件,但我只想让用户提供如何从相关实体中解析公司。
更新
我决定解析companyId而不是整个公司实体,我可以在内存中获取id列表,如果它是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
我已编辑代码以反映我真正想要做的事情,但在解决此问题上没有太大进展。
IQueryable<T>
。 - Richard Friend