2011-03-18 78 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