C# 使用linqkit'时出错;带表达式方法的谓词
一点背景:C# 使用linqkit'时出错;带表达式方法的谓词,c#,linq,dynamics-crm-2011,linqkit,C#,Linq,Dynamics Crm 2011,Linqkit,一点背景: 我使用的是不支持某些操作的Linq提供程序(,但实际上并不重要)。 具体来说,它不支持表达式中的Contains()。 意思-类似的东西不起作用:var users=DataContext.users.Where(user=>userIds.Contains(user.Id)) 因为它使用的是的谓词,所以我将使用user.Id==userIds[0]|| user.Id==userIds[1]…|而不是userIds.Contains(…)user.Id==userid[100] 为
我使用的是不支持某些操作的Linq提供程序(,但实际上并不重要)。
具体来说,它不支持表达式中的
Contains()
。意思-类似的东西不起作用:
var users=DataContext.users.Where(user=>userIds.Contains(user.Id))
因为它使用的是的谓词,所以我将使用user.Id==userIds[0]|| user.Id==userIds[1]…|而不是userIds.Contains(…)
user.Id==userid[100]
为此,我定义了以下函数,它接受任意集合和任意表达式,并对它们应用“Or”:
private IQueryable<TCrmEntity> FilterByCollection<TCrmEntity, T>(IQueryable<TCrmEntity> entities, IEnumerable<T> collection, Expression<Func<TCrmEntity, T, bool>> filterFunction)
{
var predicate = PredicateBuilder.False<TCrmEntity>();
predicate = collection.Aggregate(predicate, (current, collectionElement) => current.Or(entity => filterFunction.Invoke(entity,collectionElement)));
var query = entities.AsExpandable()
.Where(predicate);
return query;
}
专用IQueryable筛选器ByCollection(IQueryable实体、IEnumerable集合、表达式筛选器函数)
{
var predicate=PredicateBuilder.False();
谓词=collection.Aggregate(谓词,(current,collectionElement)=>current.Or(entity=>filterFunction.Invoke(entity,collectionElement));
var query=entities.AsExpandable()
.Where(谓语);
返回查询;
}
这样,我可以使用任何类型的集合和任何类型的表达式。例如,请查看此测试运行(使用内存中的用户集合):
var res=FilterByCollection(users.AsQueryable(),rolesList,(account,role)=>account.role==role)
,以查找具有给定角色之一的所有用户
但是,在运行上面的示例时,我遇到了以下异常-变量“entity”,类型为“User”,从作用域“”引用,但它没有定义
有什么想法吗
另外,我不确定这是否相关,但当我实际使用Crm数据上下文而不是内存中的集合时,我没有收到此错误:/