LINQ for CRM如何在where子句中使用C#列表

时间:2018-06-28 06:42:50

标签: c# .net linq dynamics-crm linqpad

我需要在 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

谢谢

2 个答案:

答案 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" ....)是您在其中选择要在请求中检索的属性的地方。如果未在此处指定属性,则该属性将是强制类型转换之后的默认值。