web-dev-qa-db-ja.com

文字列がジェネリックリストの要素で始まるLINQ to SQLクエリ

検索の要件が変更されたため、クエリの1つを更新したいと考えています。当初、ユーザーは単一のSKUと製造を入力することでした。製品カタログを検索する日付範囲。これが私が使用したものです。

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のコンマ区切りリストをテキストボックスに入力して検索できることを示しています。私が困惑しているのは、製造ですべての製品を見つける方法です。 skuListのSKUのいずれかで始まる日付範囲(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;

どんなアイデアでも大歓迎です!

16
Andy Evans

何かのようなもの

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; 
22
Richard Friend
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;
4
Jamiec