2015-07-23 13 views
1

Как написать «Where Any In» в LINQ to Entity?LINQ to Entities, где 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 List. То, что им пытается сделать:

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

Я думаю, что его хорошо, но то, что я получаю сообщение об ошибке:

«Невозможно создать постоянное значение типа„“ConsoleApplication1.Category Только примитивные тип или тип перечисления. поддерживаются в этом контексте»

+0

сделать myCategories список, если Guid вместо списка категории ... что должно сделать трюк – Gustavo

ответ

0

Пробуйте сравнить с категориями в оперативной памяти Коллекция идентификаторов, а не коллекция категорий.

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

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

это потому, что ctx.Chairs является коллекция, которая находится в базе данных, вы должны получить эту коллекцию первых для того, чтобы сравнить его с в памяти данных:

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

EDIT:, что не было бы правильным, что нужно сделать, если у вас есть много лиц по базе данных, что вы можете сделать, это разделить его на два запроса:

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(); 
+0

Ye, но если Символы есть, например, 1 млн объектов не будет столь хорошим решением я считаю: D – CSharpBeginner

+0

вы правы, ха-ха, дело 'ctx.Chairs.Where (x => x.Table.Categories' делает ваш запрос очень сложным –

0

Вы можете выбрать из Идентификаторы myCategories и использовать последний оператор.

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();