LINQ to Entities,任何地方
LINQ to Entities, Where Any In
如何在 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);
我只想获取属于 Table 且从 myCategories 列表中获得类别之一的椅子。这就是我想要做的:
var result =
ctx.Chairs.Where(x => x.Table.Categories.Any(y => myCategories.Any(z => z.Id == y.Id))).ToList();
我认为没问题,但我得到的是错误:
"Unable to create a constant value of type 'ConsoleApplication1.Category'. Only primitive types or enumeration types are supported in this context"
这是因为 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();
您可以 select 来自 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();
尝试与内存中的类别 ID 集合进行比较,而不是类别集合。
var myCategoriesIds = myCategories.Select(c => c.Id).ToArray();
var result =
context.Chairs
.Where(
x => x.Table.Categories.Any(
y => myCategoriesIds.Contains(y.Id)))
.ToList();
如何在 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);
我只想获取属于 Table 且从 myCategories 列表中获得类别之一的椅子。这就是我想要做的:
var result =
ctx.Chairs.Where(x => x.Table.Categories.Any(y => myCategories.Any(z => z.Id == y.Id))).ToList();
我认为没问题,但我得到的是错误:
"Unable to create a constant value of type 'ConsoleApplication1.Category'. Only primitive types or enumeration types are supported in this context"
这是因为 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();
您可以 select 来自 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();
尝试与内存中的类别 ID 集合进行比较,而不是类别集合。
var myCategoriesIds = myCategories.Select(c => c.Id).ToArray();
var result =
context.Chairs
.Where(
x => x.Table.Categories.Any(
y => myCategoriesIds.Contains(y.Id)))
.ToList();