2012-10-17 50 views
0

我有C#拉姆達LINQ查詢如下:的LINQ(EF),其中用繩子逗號分隔條

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」)。結果列表包含其他銷售類型文章.EG(「銷售」或「進口銷售」)。

reuslt列表應該是參數傳遞的精確列表。任何人都可以請教嗎?

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"} 
}; 

我只需要Foo1如果mustcontain是A,B

+0

你可以發佈一些虛擬數據.. –

回答

1

如果我正確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(); 

根據您的評論

什麼如果我需要多個條件。例如。假設 - '標籤'包含 銷售,售後。我喜歡檢索那篇文章必須有售後和 AFTERSALE標記。不僅銷售或售後

您可以使用Enumerable.All,這裏有一個LINQ到對象例子,你可以希望轉換爲LINQ到實體:

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))); 
+0

謝謝。這解決了問題。 – Tun

+0

怎麼樣如果我需要多重條件。例如。假設 - '標籤'包含銷售,售後服務。我喜歡檢索那篇文章必須有SALE和AFTERSALE標記。不僅銷售或售後 – Tun

+0

@coder:我認爲'CtTag.Name'是一個字符串,而不是'List '。你想分割這個字符串嗎? –