Entity framework 4 从Linq到EF4 Contains方法的意外行为
在查询人员时,此语句应返回许多姓氏中带有“And”的结果-Entity framework 4 从Linq到EF4 Contains方法的意外行为,entity-framework-4,linq-to-entities,Entity Framework 4,Linq To Entities,在查询人员时,此语句应返回许多姓氏中带有“And”的结果- var results = repository.GetQuery().Where(p => p.Names .Select(n=> n.LastName) .Contains("And"); 它不返回任何结果。如果我们把它改成- var results = repository
var results = repository.GetQuery().Where(p => p.Names
.Select(n=> n.LastName)
.Contains("And");
它不返回任何结果。如果我们把它改成-
var results = repository.GetQuery().Where(p => p.Names
.Select(n=> n.LastName)
.Contains("Anderson");
我们找到了所有姓安德森的人
很明显,它被转换成了一个Equals而不是Like。此外,我们将其修改为-
var results = repository.GetQuery().Where(p => p.Names
.Select(n=> n.LastName)
.FirstOrDefault()
.Contains("And");
它返回所有姓氏中有“And”的人,不幸的是,它只检查这个人的姓
var results = repository.GetQuery().Where(p => p.Names
.Any(n=> n.LastName
.Contains("And"));
正常工作,但我们无法按希望的方式使用此功能。看起来您正在尝试执行此操作:
Select *
From Names
Where LastName like 'And%'
.Contains()方法仅适用于精确匹配。您可以使用LINQtoSQL并指定您要查找的确切SQL,但使用存储过程可能会更好
这看起来会有所帮助:长期以来一直在研究这个动态搜索问题……我无法通过树木看到森林 这不起作用,因为它是一个IEnumerable.Contains方法,只返回完全匹配
var results = repository.GetQuery().Where(p => p.Names
.Select(n=> n.LastName)
.Contains("And");
这是因为它使用的是String.Contains方法
var results = repository.GetQuery().Where(p => p.Names
.Any(n=> n.LastName
.Contains("And"));
它们是两种不同的方法。我们使用动态搜索进行最后一个查询。您应该解释您希望使用的方式,因为只有最后一个查询是正确的。您可能需要全文搜索,这在LINQ to Entities中是不支持的,您必须使用store queries滚动自己的查询。我们正在构建动态查询,它们都包含在Where方法中。动态查询由1个部分组成。财产,2。ComparisonOperator(=),此类通用解决方案只能用于标量属性,不能用于导航属性。