【问题标题】:GroupBy isn't working correct on IQueryableGroupBy 在 IQueryable 上无法正常工作
【发布时间】:2019-01-04 09:49:14
【问题描述】:

我有课:

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)

【问题讨论】:

  • 你到底想要什么结果?
  • grouppedEntitiesByName 应该有两个键 'entity' 和 'Entity'。键是“实体”的第一项应该有两个实体,IsMain = true 和 IsMain = false(每个名称都是“实体”)。键为“Entity”的第二项应该有一个名为“Entity”且 IsMain = true 的实体
  • 可能重复link
  • 它与您使用的数据库有关吗?名称的唯一区别是大写E,所以当它按DB分组时忽略大小写,它仍然是一组。在列表示例中,它首先被拉入内存,然后 groupby 在代码中完成。也许出于测试目的将名称更改为 Entity2..
  • 我正在使用 SQL Server。我尝试使用 SQL Server Management Studio 执行 group by query,似乎 SQL Server 不关心大小写

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这是因为 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,它区分大小写。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-26
      • 2016-03-21
      • 2021-04-10
      • 2016-12-01
      • 1970-01-01
      • 2014-12-16
      • 2012-03-15
      • 1970-01-01
      相关资源
      最近更新 更多