2010-09-22 62 views
3

我很確定這個問題已經被問了好幾次,我做apolgize再次問它,但我做了一些研究,不幸的是我沒有找到我的樂趣在互聯網上...LINQ 2 SQL查詢不起作用的函數調用

我有一個IQueryable的是這樣的:

public string GetIdProfiloFromName(string name) 
     { 
      return name.Substring(name.IndexOf(NameFirstSeparator)+1,name.IndexOf(NameSecondSeparator)-name.IndexOf(NameFirstSeparator)-1); 
     } 

我知道:

triggers = triggers.Where(t => GetIdFromName(t.Name) == filter.Id.ToString()); 

GetIdFromName獲取名稱的一部分來檢索該ID的功能不好,但這是迄今爲止我能做到的最好的。我的問題是,使用這兩個語句不允許使用Linq to sql。該應用程序將引發一個錯誤,而這是確定:

triggers = triggers.Where(t => t.Name.Substring(t.Name.IndexOf(NameFirstSeparator) + 1, t.Name.IndexOf(NameSecondSeparator) - t.Name.IndexOf(NameFirstSeparator) - 1) == filter.Id.ToString()); 

我懷疑是功能GetIdFromName應該給的東西不是一個字符串不同,但我真的不知道是什麼,以及如何...

感謝您的啓示,

約恩

[編輯] 更新到我的理解至今:

我canno做T我想要的,因爲爲了做到這一點,我需要做這樣的事情:

static Expression<Func<Trigger,string, bool>> IsId = (a,b) => a.name.Substring(a.name.IndexOf(NameFirstSeparator) + 1, a.name.IndexOf(NameSecondSeparator) - a.name.IndexOf(NameFirstSeparator) - 1)==b; 

,但這不會進入

triggers = triggers.Where(func<Trigger,bool>); 

,我可以想辦法做到這一點,但我必須從我的數據庫中獲取所有結果才能在內存中執行我的測試。

非常感謝,你讓我真的很清楚!

回答

5

LINQ 2 SQL正在將您的查詢轉換爲expression tree,然後將該表達式樹轉換爲SQL。由於您的自定義函數沒有SQL相關函數,因此它不知道如何翻譯它並引發異常。

+1

感謝您的快速回答。我認爲,但真正的事情是知道如何將這些代碼外部化爲「外部」功能。這裏的子字符串的東西是相當醜陋和沉重,我希望封裝它在一個不錯的功能。這應該是可能的,因爲linq to sql能夠理解它的原始格式。 – Arthis 2010-09-22 15:00:20

+1

不幸的是,你不能做你想要的。表達式樹只支持一個表達式,表示爲一棵樹。要以您想要的方式支持方法,它必須能夠處理塊。例如,'x => {return x; }'不能編譯到表達式樹中。 – 2010-09-22 15:03:10

+0

+1對於一個很好的分析。 – 2010-09-22 15:11:08