2009-11-14 63 views
2

我有一個課程,裏面有一個標題。我有一個屬性返回該標題調整了一下。如果我做LINQ SQL查詢調整的標題屬性我得到「不支持」的異常。如果我做同樣的事情,該屬性直接在linq查詢中工作。關於如何讓這個屬性在Linq中工作到Sql的任何想法?Linq to Sql支持我的字符串查詢,但不支持屬性。我可以做到嗎?

這裏是財產

public string SeoName 
{ 
    get { return Name.ToLower().Replace(" ", "").Replace("&", "and"); } 
} 

這裏是不工作(我想做什麼就能做)查詢。

var series = from s in videoRepo.GetShows() 
      where s.Topic.SeoName.Equals(topicSeoName) 
      select s; 

這裏是做同樣的事情和工作

var series = from s in videoRepo.GetShows() 
      where s.Topic.Name.ToLower().Replace(" ", "") 
      .Replace("&", "and").Equals(topicSeoName) 
      select s; 

我怎麼能結構中的頂級物業的查詢與第一LINQ查詢工作?

我最後的答案

補充說,在LINQ查詢評估什麼,我一直在尋找

public static Expression<Func<Show, bool>> 
     TopicSeoNameEquals(string name) 
    { 
     return t => t.Topic.Name.ToLower(). 
      Replace(" ", "").Replace("&", "").Equals(name); 
    } 

然後,我只是把它叫做一個有點不同

var test = Show.TopicSeoNameEquals(topicSeoName); 

var series = from s in videoRepo.GetShows().Where(test) 
      select s; 

回答

2

基本上,你的表達不能。 LINQ to SQL無法「查看」SeoName屬性並將其轉換爲SQL。但是,當您在LINQ to SQL查詢中編寫內聯代碼時,編譯器會以LINQ to SQL可以「查看內部」的方式構建它。它創建一個表達式樹 - 查詢中操作序列的抽象描述 - 而不是將代碼編譯爲MSIL。

您可以通過創建一個與SeoName完成相同工作的表達式來解決此問題,但您仍然最終將重複SeoName代碼,以便讓C#將一個副本編譯爲可調用MSIL方法,另一個作爲表達式樹。 (雖然你可以在這個上工作,通過讓你的SeoName屬性在運行時通過編譯表達式樹來工作:這會繞過重複而犧牲一些性能並且看起來有點奇怪。)

+0

我用你的想法拿出上面的最終答案。 – 2009-11-14 21:20:41

2

看看LinqKit - 它有一些東西讓一個表達調用另一個,等等。我使用PredicateBuilder是一個很好的東西。

+0

我根據鏈接中的項目創建了我的答案排序。儘管如此,我並沒有最終使用LinqKit。感謝您的鏈接,因爲它提供了一些很好的信息。 – 2009-11-14 21:21:27