LINQ to SQL запрос, где начинается строка с элементом из общего списка - PullRequest
16 голосов
/ 11 февраля 2011

Я хочу обновить один из моих запросов, так как изменились требования для поиска. Первоначально пользователь должен был ввести один 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;

Любые идеи будут с благодарностью!

Ответы [ 2 ]

22 голосов
/ 11 февраля 2011

Что-то вроде

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; 
4 голосов
/ 11 февраля 2011
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;

РЕДАКТИРОВАТЬ: Я поставлю это здесь, хотя на этот вопрос уже дан ответ.

Я достиг того же, что и принятое решение, но использовал метод расширения, чтобы улучшить читаемость:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...