0

次のようにC#Lambdalinqクエリがあります。

public IQueryable<CtArticleDetail> GetArticleDetailsByTagNames(string tagNames)
{
    return db.CtArticleTags.Where(m => tagNames.Contains(m.CtTag.Name) 
                                       && m.CtArticleDetail.ExpirationDate > DateTime.Now
                                       && m.CtArticleDetail.ArticleStatusId == (int)ArticleStatus.Published)
                           .Select(m => m.CtArticleDetail).OrderBy(x => x.LiveDate).Distinct();
}

これは、「含む」のためにわずかに間違ったデータリストを返します。パラメータは実際には次の形式になります:EG( "AterSale、GeneralSale")。結果リストには、他の販売タイプのarticles.EG(「Sale」または「ImportedSale」)が含まれます。

reusltリストは、渡されたパラメーターとしての正確なリストである必要があります。誰かplsのアドバイスはできますか?

var mustContain = new[] {"A", "B");

var foos = new  List<Foo>(){
     new Foo1 {Tags = "A"},
     new Foo1 {Tags = "B"},
     new Foo2 {Tags = "A"},
     new Foo2 {Tags = "C"}
};   

mustcontainがA、Bの場合、Foo1が必要です

4

1 に答える 1

1

あなたが正しく理解していればtagNames、コンマで区切られたtagNamesのリストである文字列です。次に、次を使用できますString.Split

String[] tags = tagNames.Split(new[]{","}, StringSplitOptions.RemoveEmptyEntries);
return db.CtArticleTags.Where(m => tags.Contains(m.CtTag.Name) && m.CtArticleDetail.ExpirationDate > DateTime.Now
            && m.CtArticleDetail.ArticleStatusId == (int)ArticleStatus.Published)
            .Select(m => m.CtArticleDetail).OrderBy(x => x.LiveDate).Distinct();

あなたのコメントによると

複数の条件が必要な場合はどうなりますか。例えば。たとえば、「タグ」にはセール、アフターセールが含まれています。SALE と AFTERSALE のタグが付けられた記事を取得したいです。SALEやAFTERSALEだけでなく

を使用できますEnumerable.All。これは、Linq-To-Entities に変換できることが期待される Linq-To-Objects の例です。

var mustContain = new[] { "A", "B" };
var foos = new List<Foo>() { 
    new Foo{Tags="A,B"},
    new Foo{Tags="B"},
    new Foo{Tags="C,A"},
    new Foo{Tags="D"},
    new Foo{Tags="B,A,C"},
    new Foo{Tags="F,C,A,D,B"},
};

var result = foos
    .Where(f => mustContain.All(mc =>  
        f.Tags.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
              .Contains(mc))); 
于 2012-10-17T10:33:35.890 に答える