gpt4 book ai didi

c# - 使用 crm 早期绑定(bind)类的 linq to sql

转载 作者:行者123 更新时间:2023-12-02 04:46:21 25 4
gpt4 key购买 nike

我正在开发基于 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.ThrowException(Exception 异常) 在 Microsoft.Xrm.Sdk.Linq.QueryProvider.FindValidEntityExpression(表达式 exp,字符串操作) 在 Microsoft.Xrm.Sdk.Linq.QueryProvider.FindValidEntityExpression(表达式 exp,字符串操作) 在 Microsoft.Xrm.Sdk.Linq.QueryProvider.TranslateWhereMethodCall(MethodCallExpression mce,FilterExpressionWrapper parentFilter,Func2 getFilter,BinaryExpression parent, bool 求反)
在 Microsoft.Xrm.Sdk.Linq.QueryProvider.TranslateWhereBoolean(String parameterName,Expression exp,FilterExpressionWrapper parentFilter,Func
2 getFilter,List1 linkLookups,BinaryExpression parent, bool 取反)
在 Microsoft.Xrm.Sdk.Linq.QueryProvider.TranslateWhere(QueryExpression qe,字符串参数名称,表达式 exp,列表
1 linkLookups) 在 Microsoft.Xrm.Sdk.Linq.QueryProvider.GetQueryExpression(表达式,Boolean& throwIfSequenceIsEmpty,Boolean& throwIfSequenceNotSingle,Projection& projection,NavigationSource& source,List1& linkLookups)
在 Microsoft.Xrm.Sdk.Linq.QueryProvider.Execute[TElement](表达式表达式)
在 Microsoft.Xrm.Sdk.Linq.QueryProvider.System.Linq.IQueryProvider.Execute[TResult](表达式表达式)
在 System.Linq.Queryable.Count[TSource](IQueryable
1 来源) 在 C:\SVN\Customers\Burulas\FlyDBOperations\FlyDBOperations\SalesOrderDetailOperations.cs 中的 Xrm.SalesOrderDetailOperations.SelectSalesOrderDetailBySeferId(XrmServiceContext 上下文,Guid Id):第 26 行 在 FlyDBOperationsTest.SalesOrderDetailOperationsSalesOrderDetailOperationsTest.SelectSalesOrderDetailBySeferIdSelectSalesOrderDetailBySeferIdTest() 在 C:\SVN\Customers\Burulas\FlyDBOperations\FlyDBOperationsTest\SalesOrderDetailOperationsSalesOrderDetailOperationsTest.cs:line 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 的查询 API,因此您必须以 CRM linq 提供程序可以解释的方式编写 linq 语句。这导致linq中存在的很多特性和方法不可用(比如Count())。这是一个link to the SDK列出了 linq 支持的功能。

因此查询将根据作为salesorder 实体的主键的salesorderid 将salesorderdeatil 加入到salesorder 记录中。然后在您的 where 子句中,您可以像以前一样根据 Id 进行过滤。最后在 select 语句中我只选择了记录的 ID。我这样做是因为它可以节省带宽。如果您不这样做,CRM 将选择实体的每个属性,当您检索大型文本字段时,它可能会导致性能问题。所以只取回你需要的东西。最后,由于不支持 Count(),我只是将结果转换为数组并从中获取长度。

关于c# - 使用 crm 早期绑定(bind)类的 linq to sql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19731096/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com