是否有类似于DataContext类的LINQPad等效类?

25

我刚开始使用LINQPad,到目前为止我很喜欢它,但是我发现大部分LINQ TO SQL的教程都使用了由Visual Studio生成用于持久化更新等操作的DataContext类。我对LINQ TO SQL也相当新,所以我的问题是在LINQPad中是否有以下内容的等效项(如果有的话)...

MyDbDataContext db = new MyDbDataContext();

...

db.SubmitChanges();

1
你的代码生成的类是所选数据库的生成DataContext的一部分。如果需要在LINQPad代码中引用上下文,请使用“this”。注意:LINQPad生成的上下文与LINQ to SQL并不完全相同,因此某些边缘情况在LINQPad中可能无法像在LINQ to Sql中那样工作。 - Jim Wooley
6个回答

32

简短回答:您无需自己创建DataContext。LINQPad带有许多示例,请查看它们。

当您将LINQPad连接到数据库时,它会为您创建DataContext。 DataContext的表(Table<T>)和SubmitChanges()可作为本地成员使用。

例如,在LINQPad的默认“C# 表达式”模式下,您只需编写:

from p in Person
where p.Name == "Joe"
select p.Address
在LINQPad的"C#语句"模式中:
var query = from p in Person
            where p.Name == "Joe"
            select p.Address;

query.Dump(); // Dump() shows results below

Person joe = query.First();
joe.Name = "Peter";
SubmitChanges();

joe.Dump(); // shows joe's values under the previous query results

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

请注意,您甚至无需连接到数据库即可使用LINQPad。您可以使用内存中的集合进行操作:

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

实际上,您甚至不需要使用LINQ即可使用LINQPad。它也非常适用于片段编译器。


2
使用LINQ to SQL和LINQPad插入新记录怎么样?我尝试在具有标识列的数据库中通过调用Table<TEntity>上的InsertOnSubmit()进行插入,但是我收到了一个异常“无法修改该列”。Id从未被指定。 - Jeff LaFay
@jlafay 可能早就解决了,但也许您的TEntity没有设置主键。 - Eric Wu

20

如前所述,您无需创建DataContext,因为LINQPad默认会创建一个。
但是以防万一,如果您需要使用同一数据库的第二个DataContext,则可以使用。

var secondDataContext = new UserQuery();

这将创建一个类似于自动创建的第二个数据上下文。


谢谢!这正是从Visual Studio复制和粘贴查询到LinqPad所需的,只需要进行这个小改变,否则就必须删除数据库上下文! - Lyubomir Velchev

18

我知道这个问题已经有答案了,我同意Lucas的看法,但是想添加一些可能有助于读者理解的内容。

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

以下C#语句展示了这一点:

  this.GetType().Name.Dump();  // Shows UserQuery

这个UserQuery类派生自DataContext。在这个例子中,我让Linqpad为AdventureWorks数据库构建了一个数据上下文:

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

1
帮助我弄清楚了在类的构造函数中需要传递什么才能在该范围内运行查询。public class SubClass { public SubClass(TypedDataContext db) { db.Users.Where(x => x.IsActive); } } 并使用 new SubClass(this); 创建它。 - Thymine

10

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

var connectionString = this.Connection.ConnectionString;
var secondDataContext = new UserQuery(connectionString);
当我使用上面的代码时,它给了我一个第二个 DataContext。

9
值得一提的是,现在这种写法已经不起作用了(至少在4.42.01版本中),因为构造函数现在需要一个IDbConnection参数。所以现在你可以这样做:var secondDataContext = new UserQuery(this.Connection)。 - James Manning
1
使用 LINQPad 5,我按照 Andrew 的建议进行了如下操作:using (var dc = new PulseDataContext(this.Connection.ConnectionString)) { /* 在此处编写您的更新/插入代码 */ dc.SaveChanges(); } - CAK2

3
根据@Thymine在@DRS9222的答案下的评论,你可以简单地使用以下内容:
void Main()
{
    TypedDataContext db = this;

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

这样做就可以在 LinqPad 和您的 IDE 之间进行方便的转移,而无需修复或删除上下文。


2

每当我在主函数之外添加一个静态方法时,我可以使用以下样例进行访问:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接