LINQ小组提问

时间:2008-09-27 03:37:52

标签: linq

我今天开始和Linq一起玩,遇到了一个我无法找到答案的问题。我正在查询一个有一些员工记录的简单SQL Server数据库。其中一个字段是全名(cn)。我认为通过在第一个空格处分割全名来分组第一个名称会很有趣。我试过了

group by person.cn.Split(separators)[0]

但遇到了一个冗长的运行时异常(看起来很像C ++模板实例化错误)。

然后我尝试用名字的几个字母分组:

group by person.cn.Substring(0,5)

这很好但不是我想要的。

我想知道两件事:

  • 为什么第一个示例看起来与第二个示例非常接近时不起作用?
  • 知道幕后是SQL的东西,有效地做这种事情的好方法

谢谢,

安德鲁

3 个答案:

答案 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#中进行分组会更快。

再次感谢,

安德鲁