使用linq从动态sql查询中检索和打印数据

时间:2009-01-25 02:32:48

标签: c# sql linq

我有一些现有的代码,它使用我想要转换为linq的ADO.NET从数据库中检索数据。

代码所做的是通过命令行接收SQL查询,执行它,返回行及其列名,然后将它们打印到屏幕上。我想知道如何在linq中编写此代码。

ENTIRE sql查询必须通过命令行给出,因为我想限制从哪里选择行。这是我想要它完成的唯一方法,所以除非你有一个可以这样工作的方法,否则我不能使用它。除了我自己,没有人可以访问该程序,因此安全性不是问题。

private static SqlConnection sqlConnection = new SqlConnection();

private static void OConnection()
{
    sqlConnection = new SqlConnection();
    sqlConnection.ConnectionString = MyConsoleApp.Properties.Settings.Default.ConnStr;
    sqlConnection.Open();
}

...

string query = Console.ReadLine();
OpenConn();
SqlCommand command = new SqlCommand(query, sqlConnection);
SqlDataReader reader = command.ExecuteReader();

if (reader != null)
{
    while (reader.Read())
    {
        for (int i = 0; i < reader.FieldCount; i++)
        {
            Console.Write("| {0}: {1}", reader.GetName(i), reader.GetValue(i));
        }
        Console.WriteLine();
    }
}

3 个答案:

答案 0 :(得分:1)

我没有看到迁移到LINQ的价值。 LINQ的优点在于,您可以使用域对象的语言编写查询,而不是使用T-SQL编写查询。在您的情况下,您只想接受实际的SQL命令。看起来解析命令,将其转换为LINQ - 使用反射来识别数据上下文中的相应表 - 然后执行查询只打印出结果对象的属性似乎更有效。

答案 1 :(得分:0)

您可以将存储过程添加到数据库,然后将它们添加到linq中。 Linq提供了很好的代码生成来处理使用延迟执行获取和返回行的存储过程。

如果您希望执行的动态查询不是存储过程,那么您需要坚持使用ADO.Net或学习如何在LINQ中表达您的查询。也许如果您提供查询,我们可以帮助您使用数据上下文。

PS。当我们转移到LINQ时,我发现我们必须编写的样板ADO.Net代码的数量急剧下降。我写了我的SPRoc将它映射到sql并立即使用它:)。

答案 2 :(得分:0)

Scott Gu的动态LINQ可以找到here但是由于tvanfosson已经说过你真的不会解决很多问题,因为转移到Linq并且很可能会有更多的努力然后结果。