在LINQPad中使用FreeSql查询数据库

Posted 代码搬运工old li

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在LINQPad中使用FreeSql查询数据库相关的知识,希望对你有一定的参考价值。

如何在LINQPad中使用FreeSql

如何在LINQPad中使用FreeSql

LINQPad是一款强大的C#交互式编程环境,它可以让你轻松地编写和测试C#代码片段。除了作为一个交互式编程环境,LINQPad还可以用来连接各种数据源,包括SQL数据库、NoSQL数据库、Web服务等等。此外,LINQPad还支持使用NuGet包管理器来安装和管理第三方库。

有时候需要调试某段SQL,但是直接在项目里面编写的话,调试起来不仅麻烦,而且耗时。

那么在LINQPad中,我们可以像在SQL Server Management Studio Management Studio中,写SQL一样来写LINQ表达式和任何C#代码,并且即时编译运行获得结果!

FreeSql是一款国产的功能强大的 .NET ORM,在LINQPad中是不支持直接使用FreeSql的,不过我们可以通过添加自定义拓展类的方法,来调用FreeSql

下面是详细的操作步骤。

  1. 打开LINQPad添加一个新的连接

  2. 这里选择数据上下文的时候一定要选择EFCore!

  3. 选择你的数据库类型并创建连接

  4. 回到主界面,按下Shift + Ctrl + Y 快捷键,创建一个自定义拓展,代码如下。

        public static class free
        
           public static IFreeSql sql = new FreeSql.FreeSqlBuilder()
                 .UseConnectionString(FreeSql.DataType.SqlServer, Util.CurrentCxString)
                 .UseMonitorCommand(s => Util.Metatext(s.CommandText).Dump())
                 .Build();
        
    
  5. 代码中的Util.CurrentCxString表示在LINQPad中获取当前上下文的连接字符串。.UseMonitorCommand(s => Util.Metatext(s.CommandText).Dump())用于输出SQL语句

  6. 接下来在查询中使用FreeSql。

       var result = await free.sql.Select<TABLE>()...
    

  7. 以上就是关于如何在LINQPad中使用FreeSql的全部内容了。

LinqPad,使用多个数据上下文 - DevForce

【中文标题】LinqPad,使用多个数据上下文 - DevForce【英文标题】:LinqPad, using multiple datacontexts - DevForce 【发布时间】:2012-05-21 09:26:47 【问题描述】:

我已经购买了高级版的 LINQPad。我认为还可以使用 DevForce 模型执行跨数据库查询。

有两种方法可以做到这一点。最简单的就是拖拽 方法:按住Ctrl键的同时拖动其他数据库 从模式资源管理器到查询编辑器。访问那些 查询中的其他数据库,使用 database.table 表示法, 例如,Northwind.Regions.Take(100)。您查询的数据库必须 驻留在同一台服务器上。

第二种方法是列出您想要的额外数据库 在连接属性对话框中查询。此对话框还可以让您 从链接服务器中选择数据库。以下是如何进行:

    添加新的 LINQ to SQL 连接。 选择指定新数据库或现有数据库,然后选择要查询的主数据库。 单击“包括其他数据库”复选框并选择要包括的额外数据库。您还可以选择数据库 此对话框中的链接服务器。

Source

但显然没有办法,不是吗?有人解决这个问题吗?

【问题讨论】:

【参考方案1】:

跨数据库查询仅适用于标准 SQL Server 连接、同一服务器或链接服务器上的数据库。主要理由是确保服务器端加入(否则您最终会在加入时将整个表拉回客户端)。

我考虑向 LINQPad 添加一项功能以允许任意跨数据库查询,因为有时即使在客户端加入时它也会很有用。然而,让它与自定义数据上下文(例如 DevForce 或实体框架)一起工作变得非常棘手,因此该功能最终进入了“太难的篮子”。一个主要问题是处理命名空间/程序集/app.config 冲突。

请记住,没有什么可以阻止您按 F4 并添加对包含附加数据上下文的程序集的引用。当然,您必须手动实例化第二个数据上下文,但这应该不是什么大问题。您仍然会获得自动完成功能,并且如果您为其创建单独的连接,您仍然可以在树视图中看到其架构。如果 LINQPad 支持多连接查询,那么从功能上讲,这就是你最终会得到的结果。

LINQPad 对 SQL Server 的跨数据库查询支持的特别之处在于,它可以通过简单地添加对另一个程序集的引用来完成您无法做到的事情,这是为了允许高效跨数据库通过利用服务器端连接进行查询。

【讨论】:

非常感谢。这肯定会有所帮助。【参考方案2】:

您可以根据需要实例化任意数量的上下文来分散 SQL 实例并执行伪跨数据库连接、复制数据等。注意,跨上下文的连接是在本地执行的,因此您必须调用 ToList()、ToArray() 等在加入之前分别使用各自的数据源执行查询。换句话说,如果您将来自 DB1.TABLE1 的 10 行与来自 DB2.TABLE2 的 20 行“内部”连接起来,则在 Linq 执行连接并返回相关/相交之前,必须将这两个集合(所有 30 行)都拉入本地计算机的内存中设置(每个示例最多 20 行)。

//EF6 context not selected in Linqpad Connection dropdown
var remoteContext = new YourContext();
remoteContext.Database.Connection.ConnectionString = "Server=[SERVER];Database="
+ "[DATABASE];Trusted_Connection=false;User ID=[SQLAUTHUSERID];Password=" 
+ "[SQLAUTHPASSWORD];Encrypt=True;";
remoteContext.Database.Connection.Open();
var DB1 = new Repository(remoteContext);

//EF6 connection to remote database
var remote = DB1.GetAll<Table1>()
    .Where(x=>x.Id==123)
    //note...depending on the default Linqpad connection you may get 
    //"EntityWrapperWithoutRelationships" results for 
    //results that include a complex type.  you can use a Select() projection 
    //to specify only simple type columns
    .Select(x=>new  x.Col1, x.Col1, etc... )
    .Take(1)
    .ToList().Dump();  // you must execute query by calling ToList(), ToArray(),
              // etc before joining


//Linq-to-SQL default connection selected in Linqpad Connection dropdown
Table2.Where(x=>x.Id = 123)
    .ToList() // you must execute query by calling ToList(), ToArray(),
              // etc before joining
    .Join(remote, a=> a.d, b=> (short?)b.Id, (a,b)=>newb.Col1, b.Col2, a.Col1)
    .Dump();

localContext.Database.Connection.Close();
localContext = null;

【讨论】:

以上是关于在LINQPad中使用FreeSql查询数据库的主要内容,如果未能解决你的问题,请参考以下文章

FreeSql使用WithSql+ ToSQL 查询数据

LINQ/LinqPad:相同的查询不同的结果

从LinqPad入门Linq

FreeSql使用WithSql+ ToSQL 查询数据

LinqPad + EF 4.1 + SQL Server CE

LinqPad,使用多个数据上下文 - DevForce