Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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# 稍微复杂的多对多linq查询让我陷入困境_C#_Linq_Entity Framework_Linq To Entities - Fatal编程技术网

C# 稍微复杂的多对多linq查询让我陷入困境

C# 稍微复杂的多对多linq查询让我陷入困境,c#,linq,entity-framework,linq-to-entities,C#,Linq,Entity Framework,Linq To Entities,因此,我正在使用asp.NETMVC项目访问实体 我总是被这种问题难倒 我的模式是: ProductTag +TagName +<<ProductNames>>//Many-to-many relationship ProductName +FullName +<<Tag>>//Many-to-many relationship PurchaseRecord +Amount +<<ProductName>>//one p

因此,我正在使用asp.NETMVC项目访问实体

我总是被这种问题难倒

我的模式是:

ProductTag
+TagName
+<<ProductNames>>//Many-to-many relationship

ProductName
+FullName
+<<Tag>>//Many-to-many relationship

PurchaseRecord
+Amount
+<<ProductName>>//one productname can be linked to Many purchase records.
我尝试过改变一些东西,尝试过使用Contains,但我知道我在某些地方根本错了

我不断得到:

无法创建“ProductName”类型的常量值。在此上下文中仅支持基本类型“如Int32、String和Guid”

更新 在下面的帮助下,它的工作原理如下:

var total= item.ProductNames.SelectMany(x => x.PurchaseRecords)
                                             .Sum(s => s.Amount);

当您遇到这种错误时,您需要在linq查询之外执行所有计算,并将值作为变量传入

您的查询存在的问题是tag.ProductNames.Any与上下文无关

此计算未转换为SQL,因为它不是字符串/guid或int

您需要在查询中查询此对象,并从此对象进行计算

我不确定这是否清楚

你需要像这样做

var query1 = (from x in tags where x.tagID = id select x.ProductNames)
                                                          .SelectMany(...)
“选择多个”是因为您正在选择一个集合PRODUCTNAME,并且需要将其作为平面集合/集合带回,以便在下一次查询中对其执行.Any操作

然后用这个做一个查询1.Anylogic

通过这样做,您将保持linq to entity,而不是转换为linq to对象


ForEach不是一个选项,因为它将在集合上迭代。

您可以使用一个可计算的方法在C中而不是在sql server上执行查询的某些部分。当您在对象的内存集合中有部分数据时,这通常是必需的,所以在查询中使用它们并不容易。您必须在.net端执行部分查询执行。对于您的问题,请尝试

decimal total = myentities.PurchaseRecords.AsEnumerable()
                    .Where(x => thetag.ProductNames.Any
                         (a => a.FullName == x.ProductName.FullName))
                         .Sum(s => s.Amount);

请访问此网站以了解有关可计算的更多信息

如果我的代码不清楚,请道歉。GetAll只是我调用entitiescontext的存储库。更新问题。你能就你的第一句话举个小例子吗?我应该传递什么?好的,我想我明白了,但这意味着我必须在tag.ProductName=>中执行类似于foreachitem的操作,以找到正确的购买记录?太好了!非常感谢Alenxandre:var total=item.ProductNames.SelectManyx=>x.PurchaseRecords.Sums=>s.Amount;我还没有掌握如何将此作为linq查询来编写查询符号,但我很高兴它能起作用。很高兴我能在这方面帮助您:只需编辑一下您的答案,添加一些格式,希望一切正常!=谢谢如果有许多PurchaseRecords,这可能会导致他的性能问题,因为它将查询表中的所有PurchaseRecords。是,这将导致性能问题。好的解决方案是,除非您真的需要对象,否则不要首先将对象放入内存中。但如果你想这样做,这就是解决办法
decimal total = myentities.PurchaseRecords.
                           Where(x => query1.Any
                                (a => a.FullName == x.ProductName.FullName))
                                .Sum(s => s.Amount); 
decimal total = myentities.PurchaseRecords.AsEnumerable()
                    .Where(x => thetag.ProductNames.Any
                         (a => a.FullName == x.ProductName.FullName))
                         .Sum(s => s.Amount);