我需要在 LINQ where子句中使用C#列表。我可以在where子句中使用一个值进行查询,请指导如何在 LINQ 查询中使用C#列表。
下面是我的代码:
var usersList= new List<string>();
usersList.Add("User1");
usersList.Add("User2");
(from u in UserSet
where u.FullName.Equals("any user from usersList")
select u.FullName).Take(3).Dump();
基本上如何告诉LINQ检查usersList
中的每个值
编辑: 我正在为此LINQ for CRM
谢谢
答案 0 :(得分:6)
您可以使用Contains
var usersList= new List<string>();
usersList.Add("User1");
usersList.Add("User2");
...
(from u in UserSet
where usersList.Contains(u.FullName)
select u.FullName).Take(3)
Enumerable.Contains Method (IEnumerable, TSource)
通过使用以下命令确定序列是否包含指定的元素 默认的相等比较器。
更新
我看不到在内存列表中使用包含的方法。但是,如果用户列表不太大,则可以在内存中存储该事实之后
var results = (from u in UserSet
select u.FullName);
var results (from r in results
where usersList.Contains(r)
select r).Take(3);
不过必须有更好的方法。
答案 1 :(得分:2)
您不能在LINQ for Dynamics CRM中使用包含方法。 General是正确的,您可以将整个实体集放入内存,然后执行contains方法。但是,这效率低下-尤其是当系统上线后实体集增加时。
我已经假设您使用的是早期绑定上下文,这就是为什么要使用LINQ的原因,如果这是正确的,则可以选择执行以下操作:
var usersList= new [] {
"User1",
"User2"
};
var systemUserQuery = new QueryExpression{
EntityName = SystemUser.EntityLogicalName,
ColumnSet = new ColumnSet("fullname","domainname" ....), //explicitly retrieve attributes
Criteria = {
Conditions = {
new ConditionExpression("fullname", ConditionOperator.In, userList)
}
}
};
var usersResponse = organizationService.RetrieveMultiple(systemUserQuery);
var systemUsers = usersResponse.Entities.Select(s => (SystemUser)s).ToArray();
这在表达式中不使用LINQ来检索数据,但是查询是远程执行的,您不需要检索整个实体集。在语句var systemUsers = usersResponse.Entities.Select(s => (SystemUser)s).ToArray();
中,对象类型Microsoft.Xrm.Sdk.Entity
将被强制转换为Early Bound Type SystemUser
,您可以像其他任何Early Bounded对象一样继续使用这些对象。
使用ConditionOperator.In
运算符时,提供的值必须是一个数组。如示例所示,您可以将userList
变量声明为List<string>
。但是,在将对象添加到查询中之前,需要将其强制转换。
仅需注意,行ColumnSet = new ColumnSet("fullname","domainname" ....)
是您在其中选择要在请求中检索的属性的地方。如果未在此处指定属性,则该属性将是强制类型转换之后的默认值。