繁体   English   中英

LINQ to Entities,任何地方

[英]LINQ to Entities, Where Any In

如何在LINQ中将“凡在何处”写入实体?

这是我的模型:

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; }
}

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

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

我只想获得属于myTable列表中属于类别之一的Table的椅子。 那就是我想做的事情:

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

我认为可以,但是我得到的是错误:

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

这是因为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();

您可以从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();

尝试与内存中类别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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM