GroupBy 在 IQueryable 上无法正常工作

GroupBy isn't working correct on IQueryable

我有 class :

class Entity
{
    public string Name { get; set; }
    public bool IsMain { get; set; }
}

我正在使用 GroupBy:

从数据库获取数据
var grouppedEntitiesByName = context.GetEntities<Entity>().GroupBy(en => en.Name);

我在数据库中有一些数据:

IsMain = true, Name = "entity"  
IsMain = false, Name = "entity"
IsMain = true, Name = "Entity"

我正在使用这样的分组实体:

 foreach (var entity in grouppedEntitiesByName)
    {
        var mainEntity = entity.Single(a => a.IsMain);
    }

这里我遇到了 Sequence contains more than one matching element 异常。分组实体有一个键 entity 和三个项目:

  IsMain = true, Name = "entity"  
    IsMain = false, Name = "entity"
    IsMain = true, Name = "Entity"

然后我试了这个:

var grouppedEntitiesByName = context.GetEntities<Entity>().ToList().GroupBy(en => en.Name);

此处分组的实体有两个键: entityEntity 为什么 group by 在 IQueryable 中工作不正确以及如何解决这个问题? (我正在使用 EF)

默认情况下SQL服务器有一个不区分大小写的排序规则。 EF会发出SQL语句,因此分组结果会受到你的数据库设置的影响。

如果您需要分组区分大小写,您需要手动完成,例如添加一个不区分大小写的键的新列,这样您仍然在使用数据库。另一种将部分 运行 存储在内存中的选项是使用 LINQ 通过自定义排序器执行分组。

这是因为IEnumerable GroupBy 从内存集合中查询数据,而IQueryable GroupBy 从内存外集合查询数据。 (来源:https://www.c-sharpcorner.com/UploadFile/a20beb/ienumerable-vs-iqueryable-in-linq/

以你为例

IQueryable:

var grouppedEntitiesByName = context.GetEntities<Entity>().GroupBy(en => en.Name);

该语句被翻译成 sql 查询 - select whatever from Entity group by Name 这是一个不区分大小写的分组依据。

无法计数:

var grouppedEntitiesByName = context.GetEntities<Entity>().ToList().GroupBy(en => en.Name);

ToList() 部分将数据加载到内存中,您的 GroupBy 现在是区分大小写的 IEnumerable.GroupBy。