2

我正在开发基于 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(Expression exp, String operation) 在 Microsoft.Xrm.Sdk.Linq.QueryProvider.FindValidEntityExpression(Expression exp , 字符串操作) 在Microsoft.Xrm.Sdk.Linq.QueryProvider.GetQueryExpression(Expression 表达式, Boolean& throwIfSequenceIsEmpty 2 getFilter, BinaryExpression parent, Boolean negate) at Microsoft.Xrm.Sdk.Linq.QueryProvider.TranslateWhereBoolean(String parameterName, Expression exp, FilterExpressionWrapper parentFilter, Func, 1 linkLookups, BinaryExpression parent, Boolean negate) at Microsoft.Xrm.Sdk.Linq.QueryProvider.TranslateWhere(QueryExpression qe, String parameterName, Expression exp, ListBoolean& throwIfSequenceNotSingle、Projection& 投影、NavigationSource& 源、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 context, Guid Id) 在 C:\SVN\Customers\Burulas\FlyDBOperations\FlyDBOperations\SalesOrderDetailOperations.cs: 第 26 行 FlyDBOperationsTest.SalesOrderDetailOperationsSalesOrderDetailOperationsTest.SelectSalesOrderDetailBySeferIdSelectSalesOrderDetailOperations.cs:line 26客户\Burulas\FlyDBOperations\FlyDBOperationsTest\SalesOrderDetailOperationsSalesOrderDetailOperationsTest.cs:第 82 行

4

2 回答 2

6

我相信这应该对你有用。

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())。这是列出了 linq 支持的功能的 SDK 的链接。

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

于 2013-11-01T21:09:38.487 回答
-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

于 2013-11-01T16:57:54.590 回答