升级到EF Core 3破坏了所有LINQ查询

时间:2019-11-17 16:09:46

标签: c# linq entity-framework-core ef-core-3.0

在我得到错误并且理解了解释之后,我已经读了为什么(https://docs.microsoft.com/en-us/ef/core/querying/client-eval),但是我不确定需要更改什么。

所以这行不通:

var result = (from ts in _context.TradesSeries
                          join tts in _context.TradesTrades
                          on ts.Id equals tts.SeriesId
                          where seriesIds.Contains(tts.SeriesId) && tts.FirstPartyId == null &&
                                tts.Status != "closed" && tts.Status != "cancelled"
                          group new { ts, tts } by new { tts.SeriesId } into g
                          select new TotalByIsin
                          {
                              SeriesId = g.Key.SeriesId,
                              IsinShortCode = g.Select(i => i.ts.Number).Distinct().First(),
                              Isin = g.Select(i => i.ts.Isin).Distinct().First(),
                              Amount = (double)g.Sum(pt => pt.tts.Amount),
                              NumberOfTrades = g.Count()
                          }).ToList();
            return result;

这也不会:

var result = (from tt in _context.TradesTrades
                          join ts in _context.TradesSeries on tt.SeriesId equals ts.Id
                          join ttd in _context.TradesTradeDistributors on tt.Id equals ttd.TradeId
                          join to in _context.TradesOrganisations on ttd.DistributorId equals to.Id
                          where seriesIds.Contains(tt.SeriesId) && tt.FirstPartyId == null &&
                                      tt.Status != "closed" && tt.Status != "cancelled" && 
                                      to.DefaultDistributor !=1 && to.ExcludeDistSponView !=1 && to.ExcludeFromDwdpTotal !=1
                          join tc in _context.TradesCountries on to.CountryId equals tc.Id into tcj
                          from tc in tcj.DefaultIfEmpty() // GroupJoin -> left join
                          group new { tt, ts, ttd, to, tc } by new { ttd.DistributorId}
                          into tradeg
                          let commissionTotal = tradeg.Sum(trade => trade.ttd.Commission)
                          orderby commissionTotal descending
                          select new TopDistributors
                          {
                              //SeriesId = tradeg.Key.SeriesId,
                              DistributorName = tradeg.First().to.Name,
                              IsinShortCode = tradeg.First().ts.Number,
                              CountryName = tradeg.First().tc == null ? "N/A" : tradeg.First().tc.Name,
                              Amount = Math.Ceiling((double) commissionTotal)
                          }).Take(5).ToList();
             return result;

...根据我在StackOverflow LINQ专家的帮助下构建的其他30个奇怪查询中的任何一个,都不会出现。在这些查询中什么被认为是客户端,什么不是?是否有一个简单的修补程序可以解决此问题,还是我应该只使用Dapper并直接使用SQL以防万一Microsoft决定再次破坏LINQ功能?虽然,我宁愿不必在明天其余的团队开始之前完全重写30个查询。 ???‍♂️

谢谢!

2 个答案:

答案 0 :(得分:0)

我能够将Pomelo.EntityFrameworkCore.MySql回滚到2.2.6版,并且一切都可以正常工作。

由于Ian提供了一个包含一个包含函数调用的示例的链接,因此将调查什么是客户端,什么不是客户端,这实际上并不能回答我发布的问题。我仍然不知道什么是客户端,什么不是...例如,LET是客户端的东西吗?

答案 1 :(得分:0)

这是因为重大更改导致无法自动进行客户端评估。

您可以在联接上使用AsEnumerable(),然后使用groupBy并选择不能转换为SQL的语言。