[英]Linq (EF) where clause with string comma seperated
我有C#Lambda linq查询,如下所示:
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”)。 结果列表包含其他销售类型article.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"}
};
如果mustcontain是A,B我只需要Foo1
如果我正确理解您的话, 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。 不仅销售或折扣
您可以使用Enumerable.All
,这是一个Linq-To-Objects示例,您可以将其转换为Linq-To-Entities:
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)));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.