【问题标题】:LINQ to Entities, Where Any InLINQ to Entities,其中有任何
【发布时间】:2015-07-23 17:03:19
【问题描述】:

如何在 LINQ to Entity 中编写“Where Any In”?

这是我的模型:

class Chair
{
    public int Id { get; set; }
    public int TableId { get; set; }
    public Table Table { get; set; }

}

class Table
{
    public int Id { get; set; }

    public ICollection<Chair> Chairs { get; set; }
    public ICollection<Category> Categories { get; set; }
    public Table()
    {
        Chairs = new List<Chair>();
        Categories = new List<Category>();
    }
}

class Category
{
    public int Id { get; set; }
    public ICollection<Table> Tables { get; set; }
}

我还得到了一个简单的类别列表:

List<Category> myCategories = new List<Category>(c,d,e);

我只想获取属于从 myCategories 列表中获得类别之一的 Table 的椅子。这就是我想要做的:

var result = 
ctx.Chairs.Where(x => x.Table.Categories.Any(y => myCategories.Any(z => z.Id == y.Id))).ToList();

我认为没问题,但我得到的是错误:

“无法创建“ConsoleApplication1.Category”类型的常量值。此上下文仅支持原始类型或枚举类型”

【问题讨论】:

标签: c# linq entity-framework linq-to-sql entity


【解决方案1】:

尝试与内存中的类别 Ids 集合进行比较,而不是类别集合。

var myCategoriesIds = myCategories.Select(c => c.Id).ToArray();

var result =
    context.Chairs
        .Where(
            x => x.Table.Categories.Any(
                y => myCategoriesIds.Contains(y.Id)))
        .ToList();

【讨论】:

    【解决方案2】:

    这是因为ctx.Chairs 是数据库中的一个集合,您应该先检索该集合,以便将其与内存中的数据进行比较:

    var result = ctx
        .Chairs
        .AsEnumerable() // retrieve data
        .Where(x => 
            x.Table.Categories.Any(y => 
                myCategories.Any(z => z.Id == y.Id)))
        .ToList();
    

    编辑:如果您在数据库中有很多实体,那将是不正确的做法,您可以将其拆分为两个查询:

    var tables = ctx.Tables
       .Where(x => 
            x.Categories.Any(y => 
                myCategories.Any(z => z.Id == y.Id)));
    
    var result = ctx.Chairs
        .Where(x => 
            tables.Any(t=> t.Id == x.TableId))
        .ToList();
    

    【讨论】:

    • 是的,但如果 Chars 有例如 100 万个实体,我相信它不会是一个很好的解决方案:D
    • 你是对的哈哈,问题是ctx.Chairs.Where(x =&gt; x.Table.Categories让你的查询变得非常复杂
    【解决方案3】:

    您可以从 myCategories 中选择 Id,并在最后一条语句中使用它。

    var CategoryIds = myCategories.Select(ct => ct.Id);
    var result = ctx.Chairs.Where(x => x.Table.Categories.Any(y => CategoryIds.Any(z => z == y.Id))).ToList();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-29
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      相关资源
      最近更新 更多