簡體   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