分组使用Lambda的第一个单词

时间:2013-12-04 19:01:16

标签: c# entity-framework

以下是一些数据的示例:

充电(以下是ChargeName)

  

Apple 1   Apple 2
  香蕉1
  香蕉2
  胡萝卜3

我需要生成一个如下所示的列表:(注意我需要的是真正按第一个字分组)

  

苹果
  香蕉
  胡萝卜

也许应该开始这样的事情?

db.Charges.Select(d=>d.ChargeName).GroupBy(....);

3 个答案:

答案 0 :(得分:3)

我不认为EF可以将这样的分组转换为SQL,因此使用AsEnumerable()调用(将下载所有数据)将分组移动到内存中:

db.Charges.AsEnumerable()
  .GroupBy(c => c.ChargeName.Split()[0]);

如果你实际上不需要分组,但只需要组名,那么就像LB建议的那样使用不同的方法。

答案 1 :(得分:2)

var list = new List<string> { "Apple 1", "Apple 2", "Banana 1", "Banana 2", "Carrot 3" };
var newList = list.Select(x => x.Split()[0]).Distinct().ToList();

答案 2 :(得分:2)

如果您想在RDBMS中完全执行此操作,请尝试使用SqlFunctions.CharIndex,如下所示:

var res = db.Charges.GroupBy( c =>
    c.ChargeName.Substring(
        0
    ,   SqlFunctions.CharIndex(" ", c.ChargeName) ?? c.ChargeName.Length
    )
);

请注意?? c.ChargeName.Length部分:有必要处理ChargeName为单个字时的情况。