Подтвердить что ты не робот

Запрос 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;

Любые идеи будут очень признательны!

4b9b3361

Ответ 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;