C# 使用crm早期绑定类从linq到sql
我正在开发基于crm数据库的应用程序。我想使用linq to sql获取salesorder实体下的salesorderdetails数量 我正在为此使用subselect查询。salesorder实体具有新的\u sefer字段。我的问题是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)
(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、Func2 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语句被转换为查询表达式。