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);
此处分组的实体有两个键:
entity
和 Entity
为什么 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。
我有 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);
此处分组的实体有两个键:
entity
和 Entity
为什么 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。