是否存在与DataContext类等效的LINQPad?

是否存在与DataContext类等效的LINQPad?,linq,linq-to-sql,linqpad,Linq,Linq To Sql,Linqpad,我刚刚开始使用LINQPad,到目前为止我很喜欢它,但是我遇到的关于LinqtoSQL的大多数教程都使用了一个DataContext类,它是由Visual Studio生成的,用于持久化更新等。我对LinqtoSQL也相当陌生,所以我的问题是,在LINQPad中,下面的内容是什么(如果有) 简短回答:您不需要自己创建DataContext。有很多样品,看看吧 将LINQPad连接到数据库时,它会为您创建DataContext。DataContext的表(Table)和SubmitChanges(

我刚刚开始使用LINQPad,到目前为止我很喜欢它,但是我遇到的关于LinqtoSQL的大多数教程都使用了一个DataContext类,它是由Visual Studio生成的,用于持久化更新等。我对LinqtoSQL也相当陌生,所以我的问题是,在LINQPad中,下面的内容是什么(如果有)


简短回答:您不需要自己创建DataContext。有很多样品,看看吧

将LINQPad连接到数据库时,它会为您创建DataContext。DataContext的表(
Table
)和
SubmitChanges()
作为本地成员提供

例如,LINQPad的默认“C#Expression”模式,您只需编写:

from p in Person
where p.Name == "Joe"
select p.Address
在LINQPad的“C#声明”模式中:

LINQPad的
Dump()
扩展方法非常有用,可以在任何对象或集合上调用(在LINQPad的语句模式下)以显示以下结果

请注意,使用LINQPad甚至不需要连接到数据库。您可以使用内存中的集合:

int[] numbers = new[] { 1, 2, 3, 4, 5 };
numbers.Where(n => n > 3).Select(n => n * 2).Dump();

事实上,您甚至不需要使用LINQ来使用LINQPad。作为一个代码段编译器,它也非常有用。

我知道这已经有了答案,我同意Lucas的观点,但我想补充一些东西,可能会对这个问题的读者有所帮助

如果愿意,可以从程序集中加载自己的DataContext。 无论您是加载自己的上下文还是让LinqPad为您构建一个上下文,您都是在LinqPad生成的“UserQuery”类的上下文中运行的

以下陈述表明了这一点:

  this.GetType().Name.Dump();  // Shows UserQuery
此UserQuery类派生自DataContext。在本例中,我让Linqpad为AdventureWorks数据库构建datacontext:

  this.GetType().BaseType.Dump();  // Shows TypedDataContext
如果我加载自己的名为MyDataContext的DataContext:

  this.GetType().BaseType.Dump();  // Shows MyDataContext

正如前面提到的,您不需要创建DataContext,因为LINQPad默认创建一个DataContext。
但是为了以防万一,您需要一个第二个DataContext(对于同一个数据库),您可以使用它

var secondDataContext = new UserQuery();

这将创建第二个datacontext,就像自动创建的datacontext一样

基于jaraics的回复,我发现UserQuery构造函数需要一个连接字符串。至少对于LINQPad版本4.37.11是这样。因此,我从LINQPad创建的UserQuery实例中检索了连接字符串,并使用该字符串创建了我自己的实例

var connectionString = this.Connection.ConnectionString;
var secondDataContext = new UserQuery(connectionString);

当我使用上述代码时,它给了我第二个DataContext。

每当我在主要部分之外添加静态方法时,我都可以使用以下示例进行访问:

using(var VT = new LINQPad.User.TypedDataContext())
  return (from g in VT.GM_MEMBERS  where g.Username == username select new { g.Password }).FirstOrDefault()?.Password;

根据@Thymine对@DRS9222答案的评论,您可以简单地使用以下内容:

void Main()
{
    TypedDataContext db = this;

    var qry = from i in db.Items
        select i;
    // etc. etc.
}

这样就可以在LinqPad和IDE之间进行转换,而不必修复或删除上下文。

如何使用LinqToSQL和LinqPad插入新记录?我试图通过对数据库中具有标识列的表调用InsertOnSubmit()进行插入,但遇到异常“无法修改该列”。从未指定Id。@jlafay可能很久以前就解决了,但可能您的TEntity没有设置主键。生成代码的类是为所选数据库生成的DataContext的一部分。如果需要参考LINQPad代码的上下文,请使用“this”。注意:LINQPad生成的上下文与LINQ to SQL不完全相同,因此某些边缘情况在LINQPad中的工作方式可能与LINQ to SQL.FWIW不同,这不再有效(至少在4.42.01中),因为ctor现在使用IDbConnection的参数,所以现在您可以只执行var secondDataContext=new UserQuery(this.Connection);使用LINQPad 5,我应用了Andrew的建议如下:使用(var dc=new pulcontext(this.Connection.ConnectionString)){/*您的更新/在这里插入代码*/dc.SaveChanges();}谢谢!这就是将查询从VisualStudio复制并粘贴到linqpad所需的,只需做一点小小的更改,否则必须删除db上下文!帮助我弄清楚我需要在类的构造函数中传递什么才能在该范围内运行查询<代码>公共类子类{public SubClass(TypedDataContext db){db.Users.Where(x=>x.IsActive);}}并使用
新子类(this)创建它
using(var VT = new LINQPad.User.TypedDataContext())
  return (from g in VT.GM_MEMBERS  where g.Username == username select new { g.Password }).FirstOrDefault()?.Password;
void Main()
{
    TypedDataContext db = this;

    var qry = from i in db.Items
        select i;
    // etc. etc.
}