[英]LINQ Contains weird behaviour
我设法开发了第一个具有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; 当在模型中的Collection上使用LINQ“ .Contains()”时,不会搜索字符串的各个部分。 谁能解释这种行为?
没有考虑到您的区别.... Practice1和Place1
您正在使用2个名称为“包含”的不同函数
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))
Enumerable.Contains()
正在搜索序列(列表)以查看其中是否包含确切的值。 它不是在搜索文本。
您想在每个PostCode
的字符串值中搜索部分值,但是您的代码会在邮政编码列表中搜索整个搜索值。 不同之处在于您放在右方括号的位置。
c.Practice1.Select(e => e.PostCode).Contains(searchString)
与
c.Practice1.Select(e => e.PostCode.Contains(searchString))
通过使用后者遍历每个PostCode
的字符串并匹配包含searchString
字符串,前者选择所有PostCode
然后在该searchString
列表中查找与确切的searchString
匹配的匹配searchString
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.