我上课了:
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);
这里分组的实体有两个关键点:
entity
和Entity
为什么分组依据在IQueryable
中工作不正确,以及如何解决?
(我正在使用EF)
答案 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,区分大小写。