Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用crm早期绑定类从linq到sql_C#_.net_Sql_Linq_Dynamics Crm 2011 - Fatal编程技术网

C# 使用crm早期绑定类从linq到sql

C# 使用crm早期绑定类从linq到sql,c#,.net,sql,linq,dynamics-crm-2011,C#,.net,Sql,Linq,Dynamics Crm 2011,我正在开发基于crm数据库的应用程序。我想使用linq to sql获取salesorder实体下的salesorderdetails数量 我正在为此使用subselect查询。salesorder实体具有新的\u sefer字段。我的问题是 (from d in context.SalesOrderDetailSet where context.SalesOrderSet.Where(s => s.new_Sefer.Id == Id)

我正在开发基于crm数据库的应用程序。我想使用linq to sql获取salesorder实体下的salesorderdetails数量

我正在为此使用subselect查询。salesorder实体具有新的\u 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();
它抛出以下异常。我还对subselect查询有疑问

如何使用LINQtoSQL编写此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(异常) 位于Microsoft.Xrm.Sdk.Linq.QueryProvider.findValidityExpression(表达式表达式表达式,字符串操作) 位于Microsoft.Xrm.Sdk.Linq.QueryProvider.findValidityExpression(表达式表达式表达式,字符串操作) 在Microsoft.Xrm.Sdk.Linq.QueryProvider.TranslateWhereMethodCall(MethodCallExpression mce、FilterExpressionWrapper parentFilter、Func
2 getFilter、BinaryExpression parent、Boolean negate)
在Microsoft.Xrm.Sdk.Linq.QueryProvider.TranslateWhereBoolean(字符串参数名称、表达式表达式表达式、过滤器表达式包装器父过滤器、Func
2 getFilter、列表
1链接查找、二进制表达式父项、布尔值否定)
在Microsoft.Xrm.Sdk.Linq.QueryProvider.TranslateWhere(QueryExpression qe、字符串参数名称、表达式exp、列表
1链接查找) 在Microsoft.Xrm.Sdk.Linq.QueryProvider.GetQueryExpression(表达式表达式、布尔和throwifsequenceSempty、布尔和throwifsequenceOnGoogle、投影和投影、导航源和源、列表
1和链接查找)
在Microsoft.Xrm.Sdk.Linq.QueryProvider.Execute[TElement](表达式)中
在Microsoft.Xrm.Sdk.Linq.QueryProvider.System.Linq.IQueryProvider.Execute[TResult](表达式)中
在System.Linq.Queryable.Count[TSource](IQueryable
1 source)处 在Xrm.SalesOrderDetailOperations中,选择C:\SVN\Customers\Burulas\flydbcoperations\flydbcoperations\SalesOrderDetailOperations.cs中的SalesOrderDetailBySeferid(XrmServiceContext上下文,Guid Id) 在FlyDBOperationsTest.SalesOrderDetailOperationsSalesOrderDetailOperationsTest.SelectSalesOrderDetailBySeferIdSelectSalesOrderDetailBySeferIdTest()中的C:\SVN\Customers\Burulas\FlyDBOperations\FlyDBOperationsTest\SalesOrderDetailOperationsSalesOrderDetailOperationsTest.cs:第82行

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()
}
我建议你去找林克尔。它是一个将SQL查询转换为LINQ的软件


我相信这应该对你有用

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支持的功能


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

我认为原因是这个限制:from:每个查询支持一个from子句CRM的查询API与它们的查询表达式不同吗?我一直理解它,因为所有Linq到CRM语句都转换为查询表达式,因此您只能使用Linq执行查询表达式支持的操作。我相信您的说法是正确的,Linq到CRM语句被转换为查询表达式。