2010-02-02 19 views
2

我有一個類是從DataContext繼承來使用Linq的。在DataContext上使用GetTable方法檢索一個對象

public class Context : DataContext 
{ 
    public Context(string connectionString) 
     : base(connectionString) 
    { 
    } 
} 


[Table(Name = "TableNameee")] 
public class ClassOfTable 
{ 

} 

而我有另一個類映射到表。 我使用

context.GetTable<ClassOfTable>() 

方法來檢索其映射到ClassOfTable類表中的所有行。但我想從數據庫表中檢索一行。 我可以這樣使用它:

ClassOfTable cls = context.GetTable<ClassOfTable>().Where(p=>p.id==1).First(); 

但是,這將檢索表的每一行。我不想這樣做。我應該怎麼做才能從表格中取出一行?

回答

2

它不會得到表中的所有行,只會通過SQL中的where語句獲得1行。請記住,Linq是deffered execution model,GetTable<T>實際上不會運行任何東西,只有當.First()運行時纔會被調用。

我們該方法添加到我們的DataContext做的只是這時候,在這裏它在擴展形式:

public static T GetById<T>(this DataContext dc, long id) where T : class, IBaseEntity 
{ 
    return dc.GetTable<T>().Single(t => t.Id == id); 
} 

我們的接口,這是每一個類可以非常小,爲了這個目的:

public interface IBaseEntity 
{ 
    long Id { get; set; } 
} 
+0

謝謝你的回答。我明天會測試它。再一次非常感謝你。 – uzay95 2010-02-02 23:10:58

+0

嗨,尼克。我不知道你是如何擴展Context類而不是靜態的(正如你知道的,如果我們想從DataContext類擴展Context類,我們不能將它設置爲一個靜態類,我們可以嗎?) – uzay95 2010-02-03 11:03:27

+0

@ uzay95 - 通常當你生成的DataContext類是一個部分,所以只需將該方法粘貼到另一個具有相同類類型的'.cs'中:http://msdn.microsoft.com/en-us/library/wa80x488(VS.80)。 aspx另外...只需在靜態類中使用上面的擴展方法,它將在intellisense中顯示:http://msdn.microsoft.com/en-us/library/bb383977.aspx – 2010-02-03 11:08:46

0

不,它不會。我知道它看起來會像,但linq2sql實際上可以找到必要的'最'高效的SQL。您可以嘗試它並使用分析器檢查發出的查詢。

+1

您可以使用http://www.linqpad.net/輕鬆查看您的查詢生成的SQL。 – 2010-02-02 22:36:09

+0

好的。不知道。謝謝丹。 – ziya 2010-02-03 00:12:10

相關問題