Любое из свойств равно любому из списка объектов - PullRequest
1 голос
/ 14 марта 2012

У меня есть проблема в Entity-Framework с использованием Code-First, которую я не смог решить.

Наличие в моей базе данных объектов типа

public class Product {
  public int ID {get; set; }
  public virtual ICollection<Category> Categories { get; set; }
}

public class Category {
  public int ID {get; set;}
  public virtual ICollection<Product> Products { get; set; }
  // rest omitted
}

, я пытаюсьполучить все продукты, имеющие хотя бы одну категорию, из списка указанных категорий.Мне нужно выражение, так как это выражение позже объединяется с другими выражениями.

Т.е.я попытался:

var searchFor = new List<Category>{...};
var expression = product => product.Categories.Any(cat => searchFor.Contains(cat))

Выполнение этого позже для DbContext

context.Products.Where(expression).ToList();

создает исключение, в основном утверждая, что This context supports primitive types only.

Изменение его на

var expression = product => product.Categories.Any(
                              cat => searchFor.Any(d => d.ID == cat.ID));

избавиться от сравнения объектов не помогло.Я застрял.Как я могу справиться с этим?

Ответы [ 2 ]

2 голосов
/ 14 марта 2012

Вы должны избавиться от List<Category>, заменив его списком идентификаторов, например:

// I'm assuming that ID is of type long; please fix as necessary
var searchFor = new List<long>{...};
var expression = product =>
    product.Categories.Any(cat => searchFor.Contains(cat.ID))
1 голос
/ 14 марта 2012

Если у вас уже есть список категорий, вы можете создать список идентификаторов за пределами запроса:

var searchForIds = searchFor.Select(x => x.ID).ToList();
var query = context.Products
                   .Where(product => product.Categories
                                     .Any(cat => searchForIds.Contains(cat.ID)));

Я не знаю , что это сработает, но может. (Прошу прощения за отступ ... это просто чтобы избежать прокрутки.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...