Запрос LINQ to SQL, где строка StartsWith элемент из общего списка
Я хочу обновить один из моих запросов, поскольку требования к поиску изменились. Первоначально пользователь должен был ввести один SKU и mfg. диапазон дат для поиска в каталоге продукта. Так вот что я использовал.
DateTime startDate = ...;
DateTime endDate = ...;
string prodSKU = TextSKU.Text.Trim();
var results = from c in db.Products
where c.is_disabled == false
&& c.dom >= startDate
&& c.dom <= endDate
&& c.sku.StartsWith(prodSKU)
select c;
Теперь в требовании указано, что пользователь может ввести список SKU с разделителями-запятыми в текстовое поле для поиска. То, что я в тупик, - это как найти все продукты в mfg. начиная с любого из SKU в skuList (без использования цикла fornext).
string prodSKU = TextSKU.Text.Trim();
List<string> skuList = prodSKU.Split(new char[] { ', ' }).ToList();
var results = from c in db.Products
where c.is_disabled == false
&& c.dom >= startDate
&& c.dom <= endDate
// && c.sku.StartsWith(prodSKU)
select c;
Любые идеи будут очень признательны!
Ответы
Ответ 1
Что-то вроде
string prodSKU = TextSKU.Text.Trim();
List<string> skuList = prodSKU.Split(new char[] { ', ' }).ToList();
var results = from c in db.Products
where c.is_disabled ==false
&& c.dom >= startDate
&& c.dom <= endDate
&& skuList.Any(sl=>c.sku.StartsWith(sl))
select c;
Ответ 2
string prodSKU = TextSKU.Text.Trim();
List<string> skuList = prodSKU.Split(new char[] { ', ' }).ToList();
var results = from c in db.Products
where c.is_disabled == false
&& c.dom >= startDate
&& c.dom <= endDate
&& skuList.Contains(c.sku)
select c;
EDIT: Я поставлю это здесь, хотя на этот вопрос уже дан ответ.
Я получил то же самое, что и принятое решение, но используя метод расширения для удобства чтения:
public static class StringExtensions
{
public static bool StartsWithAny(this string s, IEnumerable<string> items)
{
return items.Any(i => s.StartsWith(i));
}
}
а затем решение:
var results = from c in db.Products
where c.is_disabled == false
&& c.dom >= startDate
&& c.dom <= endDate
&& c.sku.StartsWithAny(skuList)
select c;