我今天开始和Linq一起玩,遇到了一个我无法找到答案的问题。我正在查询一个有一些员工记录的简单SQL Server数据库。其中一个字段是全名(cn)。我认为通过在第一个空格处分割全名来分组第一个名称会很有趣。我试过了
group by person.cn.Split(separators)[0]
但遇到了一个冗长的运行时异常(看起来很像C ++模板实例化错误)。
然后我尝试用名字的几个字母分组:
group by person.cn.Substring(0,5)
这很好但不是我想要的。
我想知道两件事:
谢谢,
安德鲁
答案 0 :(得分:2)
Split没有翻译成SQL。
那么,如何在没有拆分的情况下进行这种字符串操作?欺骗地狱(未经测试):
string oneSpace = " ";
string fiftySpace = " ";
var query =
from person in db.Persons
let lastname = person.cn.Replace(oneSpace, fiftySpace).SubString(0, 50).Trim()
group person by lastname into g
select new { Key = g.Key, Count = g.Count };
答案 1 :(得分:1)
您的第一次尝试不起作用的原因是因为LINQ to SQL使用表达式树将您的查询转换为SQL。因此,任何不能直接转换为SQL的代码都是例外 - 这包括对Split的调用。
答案 2 :(得分:1)
谢谢大家,我会尝试“替换”技巧,看看是否会运行。我对LINQ非常感兴趣,但现在看起来有一些隐藏的神秘感,你必须知道你的LINQ查询转化为什么才能有效地使用它。
核心问题当然是我不太熟悉SQL,所以这就是我要开始的地方。
编辑:
我今天终于尝试了“替换”并且它有效。我甚至按计数对分组结果进行排序,所以现在我的公司里有一个名称的帕累托。然而,它的速度非常慢。选择所有内容并直接在C#中进行分组会更快。
再次感谢,
安德鲁