LINQ包含奇怪的行为

New*_*eek -1 c# linq contains asp.net-mvc-5

我已经设法开发了我的第一个具有CRUD功能的MVC 5 Web应用程序.

我的数据搜索记录的方法很少,但其中一个似乎没有按照我的预期进行.这是我的控制器搜索查询代码:

query = query.Where(c =>
        c.PostCode.Contains(searchString)
        || c.Place1.Select(e => e.PostCode).Contains(searchString)
Run Code Online (Sandbox Code Playgroud)

这是我的模特:

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

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

    public virtual ICollection<Place> Place1 { get; set; }
Run Code Online (Sandbox Code Playgroud)

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

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

我已经检查了数据库中其他字段的查询,他们有同样的问题.

TDLR; LINQ".Contains()"在模型中的Collection上使用它时不会搜索字符串的各个部分.有谁能解释这种行为?

Dar*_*l42 5

没有考虑到你有所不同....练习1和地方1

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

c.PostCode.Contains(searchString)
Run Code Online (Sandbox Code Playgroud)

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

c.Practice1.Select(e => e.PostCode).Contains(searchString)
Run Code Online (Sandbox Code Playgroud)

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

你最想做的事情是:

c.PostCode.Contains(searchString) || c.Practice1.Any(e => e.PostCode.Contains(searchString))
Run Code Online (Sandbox Code Playgroud)