共用方式為


使用 LINQ 建構查詢

 

發行︰ 2017年1月

適用於: Dynamics 365 (online)、Dynamics 365 (on-premises)、Dynamics CRM 2016、Dynamics CRM Online

在 Microsoft Dynamics 365 (線上和內部部署) 中的 .NET Language-Integrated Query (LINQ) 查詢提供者使用標準 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 彙總

篩選多個實體

您可以在 Microsoft Dynamics 365 和 Microsoft Dynamics 365 (線上) 中建立複雜的 .NET Language-Integrated Query (LINQ) 查詢。 使用多個 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 Language Integrated Query) 的查詢
在 LINQ 查詢中使用晚期繫結實體類別
部落格:CodePlex 上有適用於 Dynamics CRM REST/Web API 的 LINQPad 4 驅動程式

Microsoft Dynamics 365

© 2017 Microsoft. 著作權所有,並保留一切權利。 著作權