LINQ и отношения «многие ко многим» - PullRequest
5 голосов
/ 28 апреля 2011

Итак, я пишу «динамический» запрос Linq. Я создал класс «options», который содержит все динамические параметры, которые могут быть частью запроса. Некоторые из этих свойств опций являются объектами List, которые содержат идентификаторы сущностей, которые я хочу вернуть и которые являются частью отношений многие ко многим в SQL Server. Краткий пример кода и описания таблиц могут помочь (серьезно сокращены для краткости).

Настольные машины: Id int PK, Модель varchar (50), Год обучения

Цвета стола: Id int PK, Имя варчар (50)

Настольные автомобилиXЦвета: CarId int PK, ColorId int PK

public IEnumerable<Car> Search(SearchOptions options)
{
    var query = from car in ctx.Cars select car;

    // This works just fine
    if (options.MaxMileage.HasValue) query = query.Where(x => x.Mileage <= options.Mileage.Value);

    // How do I implement this pseudo code. options.Colors is a List<int>
    if (options.Colors.Count > 0)
    {
        query = query.Where(  -- select cars that are in the List<int> of colors --);
    }


    return query;
}

Ответы [ 3 ]

3 голосов
/ 28 апреля 2011

Я вижу, что вы уже получили ответ, но также рассмотрите эту альтернативу:

var query = 
    from car in ctx.Cars 
    where options.Colors.Count <= 0 || car.CarsXColors.Any(y => options.Colors.Contains(y.Id))
    select car;

Этот стиль довольно распространен, поскольку он генерирует один и тот же оператор SQL, так что ядра СУБД или LINQ могут фактически кэшировать запрос и / или план запроса для более быстрого ответа.

Оптимизатор запросов к базе данных автоматически исключит предложение WHERE, если options.Colors пусто, поэтому вы не платите здесь никаких штрафов за производительность.

2 голосов
/ 28 апреля 2011
   query = query.Where(x => options.Colors.Contains(x.ColorID))
0 голосов
/ 28 апреля 2011

Ответил на мой вопрос ...

if (options.Colors.Count > 0) 
{
    query = query.Where(x => x.CarsXColors.Any(y => options.Colors.Contains(x.Id)));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...