【问题标题】:LINQ Contains weird behaviourLINQ 包含奇怪的行为
【发布时间】:2017-02-02 16:16:00
【问题描述】:

我已经成功开发出我的第一个具有 CRUD 功能的 MVC 5 Web 应用程序。

我的数据几乎没有搜索记录的方法,但其中一种方法似乎没有达到我的预期。这是我的控制器搜索查询代码:

query = query.Where(c =>
        c.PostCode.Contains(searchString)
        || c.Place1.Select(e => e.PostCode).Contains(searchString)

这是我的模型:

public Place()
    {
        Place1 = new HashSet<Place>();
    }

    [Display(Name = "Postcode")]
    public string PostCode { get; set; }

    public virtual ICollection<Place> Place1 { get; set; }

我的数据库关系是一个自引用表 -> 1 到 0,因此字段名称相同。

谁能解释一下为什么搜索功能在搜索代码的两个部分的完整值“NR32 4TW”时会带来预期的结果,但只有搜索的第一个查询部分(在 OR 运算符之前)会找到相同的结果记录我是否会使用“NR32 4T”进行部分搜索?

我已经对照数据库中的其他字段检查了查询,它们也有同样的问题。

TDLR; LINQ“.Contains()”在模型内的 Collection 上使用时不会搜索字符串的部分。谁能解释这种行为?

【问题讨论】:

  • LINQ 是一个接口。你在使用实体框架吗?这就是实现 LINQ 接口的方法。
  • 您将Enumerable.Containsstring.Contains 混合在一起。第二个条件应该是c.Practice1.Any(e =&gt; e.PostCode.Contains(searchString))

标签: c# linq asp.net-mvc-5 contains


【解决方案1】:

不考虑你有什么不同.... Practice1 和 Place1

您正在使用名为“包含”的 2 个不同的函数

c.PostCode.Contains(searchString)

这是String.Contains(string) ...它会在您调用它的字符串中查找参数...

c.Practice1.Select(e => e.PostCode).Contains(searchString)

这是IEnumerable&lt;string&gt;.Contains(string) ...它在字符串枚举中查找字符串...

你想做的很可能是这样的:

c.PostCode.Contains(searchString) || c.Practice1.Any(e => e.PostCode.Contains(searchString))

【讨论】:

  • 我已对代码进行了调整,以在第一行反映您的评论。很好的答案,谢谢!
【解决方案2】:

Enumerable.Contains() 正在搜索一个序列(列表)以查看其中是否包含确切的值。它不是在搜索文本。

【讨论】:

  • 邮政编码是一个字符串。如果它的 EF 那么包含调用应该被翻译成 LIKE
  • @SergeyBerezovskiy 如果您在string 上调用Contains,那么是的,您是在询问该字符串是否包含子字符串。如果您在一组值上调用Contains,您是在询问该值是否在该集合中,而不是该值是该集合中某个值的子字符串。
  • @SergeyBerezovskiy 这就是为什么他说它在 OR 语句的第一部分工作得很好,但在第二部分却不行。第二部分是一个序列:c.Place1.Select(e =&gt; e.PostCode).Contains(searchString)
  • @JoePhillips 我的错 - 没有注意到第二个 包含 这里
【解决方案3】:

您想在每个 PostCode 的字符串值中搜索部分值,但是您的代码会在邮政编码列表中搜索搜索的完整值。不同之处在于你把右括号放在哪里。

c.Practice1.Select(e => e.PostCode).Contains(searchString)

c.Practice1.Select(e => e.PostCode.Contains(searchString))

通过使用后者遍历每个PostCode 的字符串并匹配包含searchString 的字符串,前者选择所有PostCodes 然后在该邮政编码列表中查找与确切searchString 的匹配项.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    • 2015-09-15
    • 2017-06-15
    相关资源
    最近更新 更多