我正在开发基于crm数据库的应用程序。我想使用linq to sql获取salesorder实体下的salesorderdetails数量。
我为此使用子查询。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编写此sql查询
select count(*) from salesorderdetail
where salesorderId in (select salesorderId from salesorder
where new_sefer = '750FEB6F-F742-E311-8F56-000C29F3049E')
“无效的'where'条件。实体成员正在调用无效的属性或方法。”
在Microsoft.Xrm.Sdk.Linq.QueryProvider.FindValidEntityExpression(Expression exp)处在Microsoft.Xrm.Sdk.Linq.QueryProvider.FindValidEntityExpression(Expression exp,String operation)在Microsoft.Xrm.Sdk.Linq.QueryProvider.ThrowException(Exception exception) ,字符串的操作)在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, 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个源代码)位于C:\ SVN \ Customers \ Burulas \ FlyDBOperations \ FlyDBOperations \ SalesOrderDetailDetailOperations.cs:C:\ SVN \ Customers \ Burulas \ FlyDBOperations \ SalesOrderDetailDetailOperationsSaSelectOrder()中的Xrm.SalesOrderDetailOperations。客户\ 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;
说明:
您正在编写的linq表达式实际上并没有转换为sql。它们将转换为CRM的Query API,因此您必须以CRM linq提供程序可以解释的方式编写linq语句。这导致linq中存在的许多功能和方法不可用(例如Count())。这是指向SDK的链接,其中列出了linq支持的功能。
因此,查询将基于salesorderid(这是salesorder实体的主键)将salesorderdeatil联接到salesorder记录。然后,在您的where子句中,您可以像以前一样根据ID进行过滤。最后,在选择语句中,我仅选择了记录的ID。我这样做是因为它节省了带宽。如果不这样做,CRM将选择实体的每个属性,并且在检索大文本字段时可能会导致性能问题。因此,仅检索您需要的内容。最后,由于不支持Count(),我只是将结果转换为数组并从中获取长度。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句