2

次のEFクラスがあります。

class Product
{
   public int ProdId { get; set; }
   public int ProdDesc { get; set; }
   public int ProdKeywords { get; set; }
}  

ここで、 と を調べる検索関数を実装する必要がProdDescありProdKeywordsます。キーワードは に登録され、array製品のコレクションは に登録されます。IQueryable

string[] keywordsArray = new string[] {"kw1", "kw2", ..., "kwN"};

IQueryable<Product> products = repository.GetProducts();

キーワードに一致する製品があるかどうかを確認するには、次のLINQを使用します。

var matchingProducts = products.Where(p => keywordsArray.Any(k => p.ProdDesc.Contains(k) ||
                                                                  p.ProdKeywords.Contains(k));

これは .NET 4 で魅力的に機能します。

大きな問題は、 .NET 3.5でこのコードを使用することを余儀なくされ、そのフレームワークでは (文字列に適用されるものではなく、LINQ メソッドが) 機能しないことAnyを発見したことです。Containsそれは本当に苦痛です。コードが大きすぎてすべてを書き直すことができず、締め切りが近すぎます。

この記事は非常に興味深いと思いましたが、私の場合は機能しません。誰か助けてくれる?

4

2 に答える 2

3

内容:

static class Extension   
{
    public static bool Contains(this IEnumerable<object> source, object value)
    {
        foreach (object o in source)
            if (o.Equals(value)) return true;

        return false;
    }
}


var mylist = keywordsArray.ToList();

matchingProducts = products.Where(p => mylist.Exists(k => p.ProdDesc.Contains(k) ||
                                                          p.ProdKeywords.Contains(k));
于 2012-03-28T14:26:00.193 に答える
0

最初にanyにクエリを実行し、それを列挙可能オブジェクトに格納して、カウントが0より大きいかどうかを確認できます。

于 2012-03-28T13:35:58.543 に答える