LINQ包含奇怪的行为

时间:2017-02-02 16:16:00

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

我已经设法开发了我的第一个具有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; }

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

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

我已经针对数据库中的其他字段检查了查询,他们遇到了同样的问题。

TDLR; LINQ“.Contains()”在模型中的Collection上使用它时不会搜索字符串的各个部分。任何人都可以解释这种行为吗?

3 个答案:

答案 0 :(得分:5)

没有考虑到你有差别......练习1和Place1

您正在使用两个名为“Contains”的不同功能

c.PostCode.Contains(searchString)

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

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

这是IEnumerable<string>.Contains(string) ...它在字符串枚举中查找字符串...

你最想做的事情是:

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

答案 1 :(得分:1)

Enumerable.Contains()正在搜索序列(列表)以查看其中是否存在确切的值。它没有搜索文本。

答案 2 :(得分:1)

您希望搜索每个PostCode的字符串值作为部分值,但您的代码会在邮政编码列表中搜索搜索的完整值。不同之处在于您放置了右括号。

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

VS

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

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