ver*_*ery 2 .net c# sql linq dynamics-crm-2011
我正在开发基于crm数据库的应用程序.我想使用linq to sql获取salesorder实体下的salesorderdetails数量.
我正在使用subselect查询.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();
Run Code Online (Sandbox Code Playgroud)
它抛出异常.我还有关于子选择查询的问题
我如何使用linq编写这个SQL查询到SQL
select count(*) from salesorderdetail
where salesorderId in (select salesorderId from salesorder
where new_sefer = '750FEB6F-F742-E311-8F56-000C29F3049E')
Run Code Online (Sandbox Code Playgroud)
"无效'where'条件.实体成员正在调用无效的属性或方法."
在Microsoft.Xrm.Sdk.Linq.QueryProvider.FindValidEntityExpression(Expression exp,String operation)的Microsoft.Xrm.Sdk.Linq.QueryProvider.ThrowException(Exception exception)at Microsoft.Xrm.Sdk.Linq.QueryProvider.FindValidEntityExpression(Expression exp) ,字符串操作)在Microsoft.Xrm.Sdk.Linq.QueryProvider.TranslateWhereMethodCall(MethodCallExpression mce,FilterExpressionWrapper parentFilter,Func 2 getFilter, BinaryExpression parent, Boolean negate)
at Microsoft.Xrm.Sdk.Linq.QueryProvider.TranslateWhereBoolean(String parameterName, Expression exp, FilterExpressionWrapper parentFilter, Func2 getFilter,List1 linkLookups, BinaryExpression parent, Boolean negate)
at Microsoft.Xrm.Sdk.Linq.QueryProvider.TranslateWhere(QueryExpression qe, String parameterName, Expression exp, List 1 linkLookups)at Microsoft.Xrm.Sdk.Linq.QueryProvider.GetQueryExpression(Expression expression,Boolean&throwIfSequenceIsEmpty, Boolean&throwIfSequenceNotSingle,Projection&projection,NavigationSource&source,List1& 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](IQueryable1个源)在Xrm.SalesOrderDetailOperations.SelectSalesOrderDetailBySeferId(XrmServiceContext上下文中,的Guid Id)的在C:\ SVN \顾客\ Burulas\FlyDBOperations\FlyDBOperations\SalesOrderDetailOperations.cs:线26在FlyDBOperationsTest.SalesOrderDetailOperationsSalesOrderDetailOperationsTest.SelectSalesOrderDetailBySeferIdSelectSalesOrderDetailBySeferIdTest()在C:\ SVN\Customers\Burulas\FlyDBOperations\FlyDBOperationsTest\SalesOrderDetailOperationsSalesOrderDetailOperationsTest.cs:第82行
我相信这对你有用.
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;
Run Code Online (Sandbox Code Playgroud)
Explination:
您正在编写的linq表达式实际上并没有转换为sql.它们被转换为CRM的查询API,因此您必须以CRM linq提供商可以解释的方式编写您的linq语句.这导致linq中存在的许多特性和方法不可用(如Count()).以下是SDK的链接,其中列出了linq支持的功能.
因此,查询将基于salesorderid将salesorderdeatil加入salesorder记录,salesorderid是salesorder实体的主键.然后在你的where子句中,你可以像你一样根据Id进行过滤.最后在select语句中我只选择了记录的ID.我这样做是因为它节省了带宽.如果不这样做,CRM将选择实体的每个属性,当您检索大文本字段时,它可能会导致性能问题.所以只检索你需要的东西.最后,由于不支持Count(),我只是将结果转换为数组并从中得到了长度.