2013-11-01 32 views
1

我正在開發基於crm數據庫的應用程序。我想要使​​用linq to sql獲取salesorder實體下銷售訂單數量。linq to sql使用crm早期綁定類

我爲此使用了子查詢查詢。 salesorder實體具有new_sefer字段。我的查詢是

(from d in context.SalesOrderDetailSet 
       where context.SalesOrderSet.Where(s => s.new_Sefer.Id == Id) 
       .Select(i => i.SalesOrderId).Contains(d.SalesOrderId.Id) 
       select d).Count(); 

它拋出異常。我也有關於子查詢的問題查詢

如何使用LINQ to SQL的

select count(*) from salesorderdetail 
where salesorderId in (select salesorderId from salesorder 
         where new_sefer = '750FEB6F-F742-E311-8F56-000C29F3049E') 

我寫這篇文章的SQL查詢「無效‘其中’狀態。實體部件調用一個無效的屬性或方法。」

在Microsoft.Xrm.Sdk.Linq.QueryProvider.ThrowException(例外的例外) 在Microsoft.Xrm.Sdk.Linq.QueryProvider.FindValidEntityExpression(表達式exp,字符串操作) 在Microsoft.Xrm.Sdk.Linq。 QueryProvider.FindValidEntityExpression(表達式exp,字符串操作) 在Microsoft.Xrm.Sdk.Linq.QueryProvider.TranslateWhereMethodCall(MethodCallExpression MCE,FilterExpressionWrapper parentFilter,函數功能2 getFilter, BinaryExpression parent, Boolean negate) at Microsoft.Xrm.Sdk.Linq.QueryProvider.TranslateWhereBoolean(String parameterName, Expression exp, FilterExpressionWrapper parentFilter, Func 2用getFilter,列表1 linkLookups, BinaryExpression parent, Boolean negate) at Microsoft.Xrm.Sdk.Linq.QueryProvider.TranslateWhere(QueryExpression qe, String parameterName, Expression exp, List 1 linkLookups) 在Microsoft.Xrm.Sdk.Linq。 QueryProvider.GetQueryExpression(表達式表達式,布爾型& throwIfSequenceIsEmpty,布爾型& throwIfSequenceNotSingle,投影&投影,NavigationSource &源,列表1& linkLookups) at Microsoft.Xrm.Sdk.Linq.QueryProvider.Execute[TElement](Expression expression) at Microsoft.Xrm.Sdk.Linq.QueryProvider.System.Linq.IQueryProvider.Execute[TResult](Expression expression) at System.Linq.Queryable.Count[TSource](IQueryable 1源) 在Xrm.SalesOrderDetailOperations.SelectSalesOrderDetailBySeferId(XrmServiceContext上下文中,的Guid Id)的在C:\ SVN \顧客\ Burulas \ FlyDBOperations \ FlyDBOperations \ SalesOrderDetailOperations.cs:線26 在FlyDBOperationsTest。 SalesOrderDetailOperationsSalesOrderDetailOperationsTest.SelectSalesOrderDetailBySeferIdSelectSalesOrderDetailBySeferIdTest()在C:\ SVN \客戶\ Burulas \ FlyDBOperations \ FlyDBOperationsTest \ SalesOrderDetailOperationsSalesOrderDetailOperationsTest.cs:行82

回答

5

我相信這應該爲你工作。

var count = (from d in context.SalesOrderDetailSet 
       join s in context.SalesOrderSet 
       on d.SalesOrderId.Id equals s.SalesOrderId 
       where s.new_Sefer.Id == Id 
       select d.SalesOrderId.Id).ToArray().Length; 

Explination:

你正在寫的LINQ表達式不着手轉換成SQL。它們被轉換爲CRM的查詢API,因此您必須以CRM linq提供商可以解釋的方式編寫您的linq報表。這導致linq中存在的許多功能和方法不可用(如Count())。這是一個link to the SDK,列出了linq的支持功能。

因此,查詢將基於作爲salesorder實體的主鍵的salesorderid將salesorderdeatil加入到銷售訂單記錄中。然後在你的where子句中,你可以像你一樣根據Id進行過濾。最後在select語句中,我只選擇了記錄的ID。我這樣做是因爲它節省了帶寬。如果您不這樣做,CRM將選擇實體的每個屬性,並且當您檢索大型文本字段時,它可能會導致性能問題。所以只能檢索你需要的東西。最後,由於不支持Count(),我只是將結果轉換爲數組,並從中獲得了長度。

+0

我認爲原因是這個限制:**從**:支持每個查詢一個_from_子句 – verdery

+0

是否CRM的查詢API不同於他們的查詢表達式?我一直認爲所有的Linq to CRM語句都轉換成了Query Expressions,因此你只能使用Query Expressions支持的Linq做一些事情。 – Daryl

+0

當我說查詢API時,我的意思是查詢表達式。我相信您在Linq to CRM語句轉換爲查詢表達式的陳述中是正確的。 –

-1
from t in 
(from t in db.salesorderdetail 
where 
    (from t0 in db.salesorderdetail 
    where 
     Convert.ToString(t0.new_sefer) == "750FEB6F-F742-E311-8F56-000C29F3049E" 
    select new { 
     t0.salesorderId 
    }).Contains(new { t.salesorderId}) 
select new { 
    Dummy = "x" 
}) 
group t by new { t.Dummy } into g 
select new { 
    Column1 = (Int64?)g.Count() 
} 

我建議你找LINQER。它是一款將SQL QUERYS轉換爲LINQ的軟件。

http://www.sqltolinq.com/downloads