Entity framework 4 从Linq到EF4 Contains方法的意外行为

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

在查询人员时,此语句应返回许多姓氏中带有“And”的结果-

 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(=),此类通用解决方案只能用于标量属性,不能用于导航属性。