LINQ按问题分组

时间:2020-03-06 14:49:05  来源:igfitidea点击:

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

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

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

然后,我尝试按名字的几个字母进行分组:

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

效果很好,但不是我想要的。

我想知道两件事:

  • 当第一个示例看上去与第二个示例如此接近时,为什么它不起作用?
  • 知道在幕后发生的是SQL事情,这是有效执行此类操作的好方法

谢谢,

安德鲁

解决方案

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 };

第一次尝试不起作用的原因是因为LINQ to SQL使用表达式树将查询转换为SQL。因此,任何不能直接翻译成SQL的代码都是一个例外,其中包括对Split的调用。

谢谢大家,我将尝试"替换"把戏,看看它是否可以运行。我对LINQ很感兴趣,但是现在看来有些隐秘的神秘之处,我们必须先知道LINQ查询将转换为什么内容,然后才能有效地使用它。

核心问题当然是我不太了解SQL,因此我将从这里开始。

编辑:

我终于在今天尝试了"替换",并且可以正常运行。我什至必须按计数对分组结果进行排序,所以现在我的公司中有一个与之相似的名字。但是,这太慢了。选择所有内容并直接在C中执行存储操作要快得多。

再次感谢,

安德鲁