2012-04-11 74 views
5

這是源代碼(我用的CodeSmith工具):錯誤:無法轉換lambda表達式類型「詮釋」,因爲它不是一個委託類型

public static int Delete(this System.Data.Linq.Table<EAccredidation.Data.Programs> table, int pKProgramID) 
{ 
    return table.Delete(p => p.PKProgramID == pKProgramID); 
} 

我收到此錯誤:

Cannot convert lambda expression to type 'int' because it is not a delegate type C:\Projects\New\EAccreditation.Data\Queries\ProgramsExtensions.Generated.cs

我該如何解決?

+8

恩,你真的認爲你的方法是遞歸的嗎? – 2012-04-11 07:23:50

+0

...這就是錯誤的原因! @RaymondChen把它作爲答案,你會+ 1D – 2012-04-11 07:27:27

+0

我爲CodeSmith工具工作...什麼是p.PKProgramID的類型?你是否得到任何其他構建錯誤?有關詳細信息,請參閱以下內容:http://community.codesmithtools.com/Template_Frameworks/f/66/t/10974.aspx – 2012-04-11 17:52:27

回答

6

您已經將方法規定爲擴展方法,因此就您的示例而言,可以忽略方法聲明中的第一個參數。

因此,您所關心的唯一參數是第二個,即int pKProgramID

當你調用這個方法(recuirsively),預計int,但要傳遞一個lambda委託(p => p.PKProgramID == pKProgramID

而且,正如雷蒙德陳在他的評論暗示,你的方法是遞歸的,所以你可能有你前面的進一步痛苦!

+1

當然,**如果**表中有其他地方超載。刪除(謂詞),那麼代碼會很好 – 2012-04-11 07:30:26

0

沒有內置的基於謂詞的刪除。你將不得不使用:

table.DeleteAllOnSubmit(table.Where(p => p.PKProgramID == pKProgramID)); 

還是因爲我們假設的PK是獨一無二的:

var record = table.SingleOrDefault(p => p.PKProgramID == pKProgramID); 
if(record != null) table.DeleteOnSubmit(record); 

你當然也需要SubmitChanges()上在某一時刻的背景。

+0

謝謝各位, 不幸的是,如果我忽略了方法聲明中的第一個參數,我得到: 「名稱'表'在當前上下文中不存在」 我真的需要表達式p => p.PKProgramID == pKProgramID 任何想法... 再次感謝 – 2012-04-11 16:54:48

+0

@Dobo我不明白評論:我沒有建議更改簽名,我不明白你的「我真的需要......」 - 因爲我在這兩個例子中都使用了這種方式 – 2012-04-11 17:39:54

+0

在這種情況下刪除是一種擴展方法。 – 2012-04-11 17:50:02

相關問題