C# 稍微复杂的多对多linq查询让我陷入困境
因此,我正在使用asp.NETMVC项目访问实体 我总是被这种问题难倒 我的模式是: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
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);