使用 LINQ 构建查询

 

发布日期: 2017年1月

适用于: Dynamics 365 (online),Dynamics 365 (on-premises),Dynamics CRM 2016,Dynamics CRM Online

.NET 语言集成查询 (LINQ) 中的 Microsoft Dynamics 365(在线或本地) 查询提供程序使用标准 LINQ 语法。 创建 LINQ 查询的第一步是确定相关实体类型和各类型之间的关系。 然后可以指定数据源及其他查询参数。

from 子句用于返回单个“根”实体。 查询提供程序只能返回单个实体类型的实体。orderbyselect 子句必须引用此根实体。 可以使用 join 子句将具有关系的实体添加到“根”实体中。

本主题内容

LINQ 运算符

LINQ 限制

筛选多个实体

LINQ 运算符

所有 LINQ 查询表达式均具有类似格式。 下表显示了使用 Microsoft Dynamics 365 LINQ 查询提供程序时 LINQ 查询表达式中的最常用子句。

LINQ 运算符

说明

示例

获取数据源(from 子句)

在使用生成的服务上下文和早期绑定时,请在生成的上下文中使用 IQueryable 实体集,例如 AccountSet

在不使用生成的上下文时,您可以通过组织服务上下文对象中的 CreateQuery 方法访问 Microsoft Dynamics 365 实体。

使用生成的服务上下文:

var query1 = from c in context.ContactSet
select c;

使用 CreateQuery 方法:

var query1 = from c in context.CreateQuery<Contact>()
select c;

join 子句

join 子句表示内联。 使用该子句能够处理可通过共用的属性值联接的两个或多个实体。

from c in context.ContactSet
join a in context.AccountSet on c.ContactId equals a.PrimaryContactId.Id

筛选(where 子句)

where 子句通常使用布尔表达式对结果应用筛选器。 该筛选器指定从源序列中排除哪些元素。 每个 where 子句只能包含针对单个实体类型的条件。 涉及多个实体的复合条件是无效的。 应在单独的 where 子句中筛选每个实体。

from a in context.AccountSet
where (a.Name.StartsWith("Contoso") && a.Address1_StateOrProvince == "WA")

orderby

orderby 运算符按指定顺序排列返回的查询属性。

var query1 = from c in context.CreateQuery<Contact>()   
    orderby c.FullName ascending   
    select c;
foreach ( var q in query1)   
{
    Console.WriteLine(q.FirstName + " " + q.LastName);   
}

select 子句

select 子句定义返回数据的窗体。 该子句根据查询表达式结果创建列集。 您还可以定义要使用的新对象的实例。 使用 select 子句新创建的对象不是在服务器上创建的,但它是一个本地实例。

select new Contact   
{
    ContactId = c.ContactId,
    FirstName = c.FirstName,
    LastName = c.LastName,
    Address1_Telephone1 = c.Address1_Telephone1   
};

LINQ 限制

LINQ 查询提供程序支持一部分 LINQ 运算符。 并非所有可用 LINQ 表示的条件都受支持。 下表显示了基本 LINQ 运算符的一些限制。

LINQ 运算符

限制

join

表示内部或外部联接。 仅支持左外部联接。

from

每个查询支持一个 from 子句。

where

该子句的左边必须是属性名称,该子句的右边必须是值。 不能将左边设置为常数。 该子句的两边均不能为常数。

支持 String 函数 ContainsStartsWithEndsWithEquals

groupBy

不支持。 FetchXML 支持 LINQ 查询提供程序不提供的分组选项。详细信息: 使用 FetchXML 聚合

orderBy

支持按实体属性(如 Contact.FullName)排序。

select

支持匿名类型、构造函数和初始值设定项。

last

不支持 last 运算符。

skiptake

使用服务器端分页支持 skiptakeskip 值必须大于或等于 take 值。

aggregate

不支持。 FetchXML 支持 LINQ 查询提供程序不提供的聚合选项。详细信息: 使用 FetchXML 聚合

筛选多个实体

可以在 .NET 语言集成查询 (LINQ) 和 Microsoft Dynamics 365 中创建复杂的 Microsoft Dynamics 365 (online) 查询。 可以将多个 Join 子句和筛选子句结合使用,以创建对多个实体中的属性进行筛选的结果。

以下示例演示如何创建作用于两个实体并根据每个实体返回的值筛选结果的 LINQ 查询。


using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
{
 var query_where3 = from c in svcContext.ContactSet
                    join a in svcContext.AccountSet
                    on c.ContactId equals a.PrimaryContactId.Id
                    where a.Name.Contains("Contoso")
                    where c.LastName.Contains("Smith")
                    select new
                    {
                     account_name = a.Name,
                     contact_name = c.LastName
                    };

 foreach (var c in query_where3)
 {
  System.Console.WriteLine("acct: " +
   c.account_name +
   "\t\t\t" +
   "contact: " +
   c.contact_name);
 }
}

Using svcContext As New ServiceContext(_serviceProxy)
 Dim query_where3 = From c In svcContext.ContactSet _
                    Join a In svcContext.AccountSet _
                    On c.ContactId Equals a.account_primary_contact.Id _
                    Where a.Name.Contains("Contoso") _
                    Where c.LastName.Contains("Smith") _
                    Select New With {Key .account_name = a.Name,
                                     Key .contact_name = c.LastName}

 For Each c In query_where3
  Console.WriteLine("acct: " &amp; c.account_name &amp; vbTab &amp; vbTab _
                    &amp; vbTab &amp; "contact: " &amp; c.contact_name)
 Next c
End Using

另请参阅

示例:创建 LINQ 查询
示例:复杂的 LINQ 查询
使用 LINQ(.NET 语言集成查询)构建查询
将晚期绑定实体类与 LINQ 查询结合使用
博客:适用于 Dynamics CRM REST/Web API 的 LINQPad 4 驱动程序可在 CodePlex 上找到

Microsoft Dynamics 365

© 2017 Microsoft。 保留所有权利。 版权