【问题标题】:Linq (EF) where clause with string comma seperated字符串逗号分隔的 Linq (EF) where 子句
【发布时间】:2012-10-17 22:05:25
【问题描述】:

我有如下 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")。结果列表包含其他销售类型的文章.EG(“Sale”或“ImportedSale”)。

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

【问题讨论】:

  • 你能发布一些虚拟数据吗...

标签: c# linq entity-framework-4 lambda


【解决方案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();

根据你的评论

如果我需要多个条件怎么办。例如。假设 - “标签”包含 售后,售后。我喜欢检索那篇文章必须有 SALE 和 售后标记。不仅是销售或售后

您可以使用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))); 

【讨论】:

  • 如果我需要多个条件怎么办。例如。假设-“标签”包含销售、售后。我喜欢检索那篇文章必须带有 SALE 和 AFTERSALE 标记。不仅是销售或售后
  • @coder:我认为CtTag.Name 是一个字符串,而不是List&lt;String&gt;。你也想拆分这个字符串吗?
  • 是的。 CtTag.Name 是字符串。对不起,让我解释清楚: ArticleTagTable Article1 Sale Article2 Sale Article2 AfterSale : 当参数传递 sale,aftersale 时,列表应该只返回 article2。
  • @coder:如果Name属性也是一个逗号分隔的标签列表,并且你想确保tagNames中的每个标签都包含在该属性中,你可以使用上面的代码.我还添加了一个示例(Linq To Objects)。
  • 请看下面的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-27
  • 1970-01-01
  • 2013-06-04
  • 2013-07-03
  • 2022-01-01
  • 2012-07-16
  • 2011-08-07
相关资源
最近更新 更多