在我得到错误并且理解了解释之后,我已经读了为什么(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个查询。 ???♂️
谢谢!
答案 0 :(得分:0)
我能够将Pomelo.EntityFrameworkCore.MySql回滚到2.2.6版,并且一切都可以正常工作。
由于Ian提供了一个包含一个包含函数调用的示例的链接,因此将调查什么是客户端,什么不是客户端,这实际上并不能回答我发布的问题。我仍然不知道什么是客户端,什么不是...例如,LET是客户端的东西吗?
答案 1 :(得分:0)
这是因为重大更改导致无法自动进行客户端评估。
您可以在联接上使用AsEnumerable(),然后使用groupBy并选择不能转换为SQL的语言。