LINQPad是否等同于DataContext类?

时间:2009-05-12 13:08:39

标签: linq linq-to-sql linqpad

我刚刚开始使用LINQPad,到目前为止我喜欢它,但是我遇到的LINQ TO SQL的大多数教程都使用了由Visual Studio生成的DataContext类来持久更新等。我也很新LINQ TO SQL所以我的问题是LINQPad中的以下等价物(如果有的话)......

MyDbDataContext db = new MyDbDataContext();

...

db.SubmitChanges();

6 个答案:

答案 0 :(得分:31)

简短回答:您不需要自己创建DataContext。 LINQPad附带了大量样本,请查看它们。

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

例如,LINQPad默认的“C#Expression”模式你可以写:

from p in Person
where p.Name == "Joe"
select p.Address

在LINQPad的“C#Statement”模式中:

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。它也可以作为代码片段编译器使用。

答案 1 :(得分:16)

我知道这已经有了答案,我同意卢卡斯的意见,但想补充一些可能有助于读者回答这个问题的事情。

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

以下C#声明显示了这一点:

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

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

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

如果我加载自己的DataContext,名为MyDataContext:

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

答案 2 :(得分:14)

如前所述,您不需要创建DataContext,因为LINQPad默认创建一个 但为了以防万一,你需要一个第二个DataContext (对于同一个数据库)你可以使用

var secondDataContext = new UserQuery();

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

答案 3 :(得分:10)

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

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

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

答案 4 :(得分: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;

答案 5 :(得分:1)

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

void Main()
{
    TypedDataContext db = this;

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

然后,这在LinqPad和您的IDE之间可以很容易地转移,而不必修复或删除上下文。