C# 如何将此sql转换为Linq(复杂求和)

C# 如何将此sql转换为Linq(复杂求和),c#,asp.net-core-mvc,entity-framework-core,C#,Asp.net Core Mvc,Entity Framework Core,这是桌子 公共类购买 { 公共长Id{get;set;} 公共字符串WareName{get;set;} 公共整数计数{get;set;} 公共日期时间购买时间{get;set;} 公共IList清单{get;set;} } 公共类目录 { 公共长Id{get;set;} 公共长购买ID{get;set;} [ForeignKeynameofPurchaseId] 公共购买{get;set;} public int SaledCount{get;set;} } 我尝试执行如下查询: 从中选择SU

这是桌子

公共类购买 { 公共长Id{get;set;} 公共字符串WareName{get;set;} 公共整数计数{get;set;} 公共日期时间购买时间{get;set;} 公共IList清单{get;set;} } 公共类目录 { 公共长Id{get;set;} 公共长购买ID{get;set;} [ForeignKeynameofPurchaseId] 公共购买{get;set;} public int SaledCount{get;set;} } 我尝试执行如下查询:

从中选择SUMx。[icout]作为icount 选择p.[Count]-ISNULL 从库存中选择SUMi.SaledCount作为i,其中i.PurchaseId=p.Id ,0为[icout] 从作为p购买 其中p.WareName='WareName5'和 p、 [Count]-isNull从库存中选择SUMi.SaledCount作为i,其中i.PurchaseId=p.Id,0>0 AS x` var left=\u Db.Set.Includep=>p.Inventory .Wherep=>p.WareName==WareName .Selectp=>p.Count-p.Inventory.Sumi=>i.SaledCount.Sum; 但是,当我以一个真正的数据库sqlite/sqlserver为目标时,它不起作用。 当我使用inMemoryDatabase时,它工作得很好。
有人能帮我吗?

好的,这只是使用let的一次尝试,只是在我的DNet核心站点上尝试了一下,它运行得很好。当然,我没有与您相同的实体

var left = from purchase in _Db.Set<Purchase>().Include(p=>p.Inventory)
           where purchase != null && purchase.WareName == WareName
           let sum = purchase.Inventory.Sum(i => i.SaledCount ?? 0)
           select (purchase.Count - sum).Sum();'

好的,这只是使用let的一次尝试,只是在我的DNet核心站点上尝试了一下,它运行得很好。当然,我没有与您相同的实体

var left = from purchase in _Db.Set<Purchase>().Include(p=>p.Inventory)
           where purchase != null && purchase.WareName == WareName
           let sum = purchase.Inventory.Sum(i => i.SaledCount ?? 0)
           select (purchase.Count - sum).Sum();'

我认为您缺少将实体框架连接到实际数据库的DBCONTEXT。您正在SQL查询中检查ISNULL,而不是在LINQ中检查。也许你在真实数据库中有一些空值,所以总和也变空了?var left=\u Db.Set.Includep=>p.Inventory.Wherep=>p.WareName==WareName.Selectp=>p.Count-p.Inventory.Sumi=>i.SaledCount??0.总和@萨加尔我很确定我没有失踪DbContext@Juliap.Inventory.sum return int,不能使用??Operator我认为您缺少将实体框架连接到实际数据库的DBCONTEXT。您在SQL查询中检查的是ISNULL,而不是LINQ。也许你在真实数据库中有一些空值,所以总和也变空了?var left=\u Db.Set.Includep=>p.Inventory.Wherep=>p.WareName==WareName.Selectp=>p.Count-p.Inventory.Sumi=>i.SaledCount??0.总和@萨加尔我很确定我没有失踪DbContext@Juliap.Inventory.sum return int,不能使用??Operator尝试使用您的解决方案,在_Db.Set.Includep=>p.Inventory let sum=p.Inventory.Sumi=>i.SaledCount其中p!=null&&p.WareName==WareName选择p.Count-sum.sum;它可以工作,但是它生成了N+1 sql,添加了一个不同的解决方案,应该可以解决N+1问题。退一步说,它解决了内存中的最终解决方案。我希望你的第一个问题能奏效。但至少现在你有2个变通方法,每个都有自己的缺点,但是你的第二个解决方案不能解决N+1问题!,现在我决定在_Db.Set.Includep=>p.Inventory中使用这个代码var left=from p,其中p.WareName==WareName&&p.Inventory.Selecti=>int?i.SaledCount.Sum??0p.Count-p.Inventory.Sumi=>i.SaledCount。这很奇怪,当我不使用ToList时,它会抛出异常Sequence包含多个元素`当您使用ToList时,然后执行查询,结果现在存储在应用程序的内存中。在该查询中将不再进行SQL工作。我尝试使用您的解决方案,在_Db.Set.Includep=>p.Inventory let sum=p.Inventory.Sumi=>I.SaledCount where p!=null&&p.WareName==WareName选择p.Count-sum.sum;它可以工作,但是它生成了N+1 sql,添加了一个不同的解决方案,应该可以解决N+1问题。退一步说,它解决了内存中的最终解决方案。我希望你的第一个问题能奏效。但至少现在你有2个变通方法,每个都有自己的缺点,但是你的第二个解决方案不能解决N+1问题!,现在我决定在_Db.Set.Includep=>p.Inventory中使用这个代码var left=from p,其中p.WareName==WareName&&p.Inventory.Selecti=>int?i.SaledCount.Sum??0p.Count-p.Inventory.Sumi=>i.SaledCount。这很奇怪,当我不使用ToList时,它会抛出异常Sequence包含多个元素`当您使用ToList时,然后执行查询,结果现在存储在应用程序的内存中。在该查询中将不再执行SQL工作。
public class Purchase
{
   public Purchase(){
      Inventory = new HashSet<Inventory>();
   }
   public ICollection<Inventory> Inventory { get; set; }
}