2012-10-17 85 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 '。你想分割这个字符串吗? –