2011-03-18 79 views
0

在人的查询,这句话应该返回一个数字,有“和”他们最后的名字 -意外的行为包含方法

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"); 

返回所有谁拥有的人“和”随时随地有姓氏,可惜它只检查的人的第一个姓氏。

var results = repository.GetQuery().Where(p => p.Names 
            .Any(n=> n.LastName 
            .Contains("And")); 

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

+0

你应该解释你想用什么方式,因为只有最后一个查询是正确的。 – 2011-03-18 22:04:48

+0

您可能希望全文搜索,这是afaik在LINQ to Entities中不受支持,您将不得不使用商店查询推出自己的 – BrokenGlass 2011-03-18 22:17:23

+0

我们正在构建动态查询,并且它们都包含在Where方法中。动态查询由1. Property,2. ComparisonOperator(==,<=,Contains等)组成。3. Value。然后,我们链接多个搜索表达式的语句/方法。所以我们试图让所有的东西都适合Where方法,这样它就可以被正确地解析。 – 2011-03-18 22:23:18

回答

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方法。我们走到最后一个使用我们的动态搜索。

0

它看起来像你试图做到这一点:

Select * 
From Names 
Where LastName like 'And%' 

的。载有()方法,只能使用完全匹配工作。您可以使用Linq to SQL并指定您正在查找的确切SQL,但这对于存储过程可能会更好。

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