从Linq到EF4包含方法的意外行为

时间:2011-03-18 21:37:25

标签: entity-framework-4 linq-to-entities

在查询人员时,此语句应返回一些结果中带有“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");

我们得到所有姓安德森的人。

显然它正在被转换为SQL而不是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"));

正常工作,但我们不能按照我们想要的方式使用它。

2 个答案:

答案 0 :(得分:0)

看起来你正试图这样做:

Select *
From Names
Where LastName like 'And%'

.Contains()方法仅适用于完全匹配。您可以使用Linq to SQL并指定您要查找的确切SQL,但使用存储过程可能会更好。

这看起来会有所帮助:LINQ to SQL and wildcard searches

答案 1 :(得分:0)

长期以来一直在研究这个动态搜索问题......我无法通过树木看到森林。

这不起作用,因为它是一个只返回完美匹配的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"));

它们是两种不同的Contains方法。我们最后一个使用动态搜索。