【问题标题】:Is there a LINQPad equivalent to a DataContext class?是否有与 DataContext 类等效的 LINQPad?
【发布时间】:2010-10-25 13:25:12
【问题描述】:

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

MyDbDataContext db = new MyDbDataContext();

...

db.SubmitChanges();

【问题讨论】:

  • 生成代码的类是所选数据库生成的 DataContext 的一部分。如果您需要引用 LINQPad 代码的上下文,请使用“this”。注意:LINQPad 生成的上下文与 LINQ to SQL 生成的上下文不同,因此某些边缘情况在 LINQPad 中的工作方式可能与 LINQ to Sql 不同。

标签: linq linq-to-sql linqpad


【解决方案1】:

简短回答:您不需要自己创建 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。它还可以用作 sn-p 编译器。

【讨论】:

  • 使用 LINQ to SQL 和 LINQPad 插入新记录怎么样?我尝试通过在具有标识列的数据库中的 Table 上调用 InsertOnSubmit() 来插入,但出现异常“无法修改该列”。从未指定 ID。
  • @jlafay 现在可能早就解决了,但也许你的 TEntity 没有设置主键。
【解决方案2】:

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

var secondDataContext = new UserQuery();

这将创建第二个数据上下文,就像自动创建的一样。

【讨论】:

  • 谢谢!这就是将查询从 Visual Studio 复制并粘贴到 linqpad 所需的内容,只需进行这个小的更改,否则必须删除 db 上下文!
【解决方案3】:

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

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

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

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

此 UserQuery 类派生自 DataContext。在此示例中,我让 Linqpad 为 AdventureWorks 数据库构建数据上下文:

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

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

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

【讨论】:

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

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

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

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

【讨论】:

  • FWIW,这不再有效(至少在 4.42.01 中),因为 ctor 现在采用 IDbConnection 参数,所以现在你可以做 var secondDataContext = new UserQuery(this.Connection);
  • 使用 LINQPad 5,我应用了 Andrew 的建议如下: using (var dc = new PulseDataContext(this.Connection.ConnectionString)) { /* 你的更新/插入代码 */ dc.SaveChanges() ; }
【解决方案5】:

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

void Main()
{
    TypedDataContext db = this;

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

这在 LinqPad 和您的 IDE 之间变得非常容易转移,而不必修复或删除上下文。

【讨论】:

    【解决方案6】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-12-02
      • 1970-01-01
      • 2011-02-28
      • 2013-07-25
      • 1970-01-01
      • 2016-03-15
      • 2018-06-04
      • 1970-01-01
      • 2014-12-19
      相关资源
      最近更新 更多