[英]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.