Как написать запрос предложения LINQ IN, который также будет работать как оператор LIKE?

Как мы можем написать запрос LINQ для следующего запроса sql select:

string brandid="1,2,3"
string bodystyleid="1,2,3"
-------------------
-----------------

select * from car
where brandid in (brandid)
and bodystyleid in (brandid)
----------------------
-------------------

Мое конкретное требование заключается в том, что, если brandid или bodystyleid не заполнены (если пользователь не выбирает какой-либо флажок определенного параметра поиска), запрос должен возвращать все записи для этого конкретного условия where.

Пожалуйста, ведите меня.

Спасибо,

Павел

4 ответа

Решение

Чтобы выполнить ваше требование о возврате всех товаров, если ни один из них не указан, необходимо проверить, не являются ли списки пустыми.

var brands = brandid.Split(',').Select(x => Int32.Parse(x));
var styles = bodystyleid.Split(',').Select(x => Int32.Parse(x));

var result = from c in car
             where (!brands.Any() || brands.Contains(c.brandid))
                  && (!styles.Any() || styles.Contains(c.bodystyleid))
             select c;

(аналогично решению sgmoore, но включает проверку на отсутствие марки / стиля)

На самом деле я не проверял, как это преобразуется обратно в SQL - может быть более эффективно использовать флаг, чтобы указать, есть ли какие-либо значения:

var brands = ....;   // As above
bool anyBrands = brands.Any()
var result = from c in car
             where (!anyBrands || brands.Contains(c.brandid))
               .....

Bodystyleid предназначен для проверки брандид или bodystyleid? (Я предполагаю, что bodystyleid, однако написал запрос, чтобы соответствовать запросу в вопросе (brandid))

Для начала вы можете сделать:

var results = (from c in car
               where c.brandid.Contains(brandid)
               && c.bodystyleid.Contains(brandid)
               select c).ToList();
var brandids     = brandid    .Split(',').Select(n => int.Parse(n)).ToList();
var bodyStyleids = bodystyleid.Split(',').Select(n => int.Parse(n)).ToList();


var results =
    (from c in car where 
      brandids.Contains(c.brandid) && 
      bodyStyleids.Contains(c.bodystyleid) 
     select c
   ).ToList();

IdЕсли у вас есть строки с разделителями-запятыми, они должны быть такими, как коллекции List того же типа, что и ваш Idс Car стол, так что если brandid столбец int затем brandids должен быть List<long>тогда вы можете сделать

var results = (
    from c in cars
    where brandids.Contains(c.brandid) && bodystyleid.Contains(c.bodystyleid) 
    select c).ToList();
Другие вопросы по тегам