LINQ to SQL:参数化keySelector导致LINQPad中本地求值问题
嘿,这个问题我之前也踩过一模一样的坑!咱们来拆解下问题根源,再给出解决办法:
为什么会出现全表查询+本地执行的情况?
你用的Func<App, string>是一个.NET委托类型,LINQ to SQL没办法把委托里的逻辑转换成对应的SQL表达式。这就导致LINQ provider只能先把整张表的所有数据拉取到本地内存里,然后再在本地执行GroupBy和Count操作——这就是你看到生成的SQL查了所有列,后续操作都在本地跑的原因。
怎么解决?
把委托类型换成表达式树Expression<Func<App, string>>就可以了!表达式树是一种可以被LINQ provider解析成SQL的结构,它能让数据库端直接执行分组和计数操作,只返回你需要的结果。
修改后的代码如下:
Expression<Func<App, string>> keySelector = a => a.Name; Apps.GroupBy(keySelector) .Select(g => new { Key = g.Key, Count = g.Count() }) .Dump();
这时候生成的SQL会变成类似这样的(只查询必要的列,所有逻辑在数据库执行):
SELECT [t0].[Name] AS [Key], COUNT(*) AS [Count] FROM [Apps] AS [t0] GROUP BY [t0].[Name]
如果是写通用的分组方法,也要记得参数用Expression<Func<T, TKey>>而不是Func<T, TKey>,这样才能保证LINQ to SQL能正确解析并生成高效的SQL~
内容的提问来源于stack exchange,提问作者UnionP
相关产品推荐
相关产品推荐

