GroupBy在IQueryable上无法正常工作

时间:2019-01-04 09:49:15

标签: c# entity-framework group-by iqueryable

我上课了:

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 为什么分组依据在IQueryable中工作不正确,以及如何解决? (我正在使用EF)

2 个答案:

答案 0 :(得分:2)

默认情况下,SQL Server具有区分大小写的排序规则。 EF将发出SQL语句,因此分组结果将受到数据库设置的影响。

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

答案 1 :(得分:0)

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

在您的示例中

可查询:

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

该语句被翻译为sql查询-select whatever from Entity group by Name,不区分大小写。

IEunumerable:

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

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