Как написать запрос предложения 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();