C# 在DataContext上使用GetTable方法检索一个对象

C# 在DataContext上使用GetTable方法检索一个对象,c#,linq-to-sql,C#,Linq To Sql,我有一个类是从DataContext继承来使用Linq的 public class Context : DataContext { public Context(string connectionString) : base(connectionString) { } } [Table(Name = "TableNameee")] public class ClassOfTable { } 我还有一个类映射到一个表。 我正在使用 context.G

我有一个类是从DataContext继承来使用Linq的

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


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

}
我还有一个类映射到一个表。 我正在使用

context.GetTable<ClassOfTable>()
context.GetTable()
方法检索映射到ClassOfTable类的表的所有行。但我只想从数据库的表中检索一行。 我可以这样使用它:

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

但这将检索表的每一行。我不想这样做。我应该怎么做才能从表中只获取一行?

它不会获取表中的所有行,它只会通过SQL中的where语句获取1行。请记住,Linq是一个,
GetTable
实际上并不运行任何东西,只有在调用
时才运行

我们将此方法添加到DataContext中就是为了经常这样做,这里是扩展形式:

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

不,不会的。我知道看起来会的,但linq2sql实际上能够生成必要的“最”高效的SQL。您可以尝试使用探查器检查发出的查询。

您可以使用它轻松查看查询生成的SQL。很好。我不知道。谢谢丹,谢谢你的回答。我明天会测试它。再次非常感谢。你好,尼克。我想知道,在上下文类不是静态的情况下,您是如何扩展它的(如您所知,如果我们想从DataContext类扩展上下文类,我们不能将其设置为静态类,可以吗?)@uzay95-通常在生成DataContext类时,它是一个部分,因此,只需将该方法粘贴到同一类类型的另一部分
.cs
:或者……只需在静态类中使用上面的扩展方法,它就会在intellisense中显示:
public interface IBaseEntity
{
    long Id { get; set; }
}