当表名为字符串时,如何创建LINQ-to-SQL语句?

时间:2009-11-30 14:19:02

标签: c# linq linq-to-sql

如果我有这样的数据库表的名称:

string tableName = "Addresses";
string tableName = "Customers";

如何构造这样的动态LINQ语句:

var items = from o in db.{tableName}
            select o;

foreach (var item in items)
{
    sb.Append(item.Id + Environment.NewLine);
}

我知道我可以这样做:

IEnumerable<Customer> results = db.ExecuteQuery<Customer>
    ("SELECT contactname FROM customers WHERE city = {0}",
    "London");

但是在这种情况下,我并不希望想要强类型对象作为我的结果,我只想要一个记录集来分开。

答案:

感谢Shalkalpesh,我接受了你的建议并通过完全避免LINQ来解决这个问题

SqlConnection conn = new SqlConnection();
conn.ConnectionString = ConfigurationManager.ConnectionStrings["main"].ToString();
conn.Open();
string sql = "SELECT * FROM " + tableName;
SqlDataAdapter da = new SqlDataAdapter(sql, conn);
DataTable dtResult = new DataTable();
da.Fill(dtResult);
foreach (DataRow drRow in dtResult.Rows)
{
    Console.WriteLine(drRow["Id"].ToString());
}
da.Dispose();
conn.Close();
conn.Dispose();

6 个答案:

答案 0 :(得分:4)

如果您需要记录集,可以访问上下文中DataContext类(db变量)的Connection属性,并使用它来执行常规查询并获取结果DataTableDataReader

答案 1 :(得分:1)

答案 2 :(得分:1)

抱歉 - 我现在远离开发机器,但this会帮忙吗?

似乎建议您使用DynamicQuery ...

  

另一种方式 - 正如之所提到的那样   我上一篇文章中的几位评论者    - 是使用DynamicQuery。 DynamicQuery是安装的示例之一   您可以找到101个LINQ样本   点击“帮助”|样品在   视觉工作室。如果你钻进了   示例文件夹有一个DynamicQuery   示例项目,基本上   由一个提供的类组成   基于字符串的lambda表达式   解析。

     

类DynamicQuery类是self   包含,你可以简单地添加它   你的项目。它提供额外的   让你使用的扩展方法   各种各样的字符串表达式   查询方法包括.Where()   方法(但不幸的是   上面的例子不是.Single()   方法)。所以用Dynamic Query来   上面.Load()方法也可以   写如下:

帖子上还有一个实际的代码示例......

答案 3 :(得分:0)

LINQ to SQL意味着强类型,所以我认为你不能使用LINQ to SQL来使用动态表名,除非你使用ExecuteQuery

由于

答案 4 :(得分:0)

我认为Dynamic Linq不是解决方案。

据我所知,你的问题无法解决。

即使使用动态linq,编译器也需要以某种方式确定字符串在编译时引用的表,以允许对其成员进行强类型化。

例如,假设您有两个表:

Product {Id, Name, Value}
Customer {Id, Firstname, Surname, Address, Email, ...}

您使用Linq-to-SQL作为您的ORM:

var items = from p in MagicTableResolver("Product")
            where p.Firstname // <-- How could intellisense allow this?
            select p;

var items = from c in MagicTableResolver("Customer")
            where c.Name // <-- It can't, it cannot be strongly typed
            select c;

答案 5 :(得分:0)

建立thisthis,这里是如何在字符串tablename上运行一些LINQ命令。我还没有弄清楚如何使查询语法工作(如“FROM”和“SELECT”),但你仍然可以获取和插入行。

Type tableType = Assembly.GetExecutingAssembly().GetType("NameSpace.TableName");
ITable itable = dbcontext.GetTable(tableType);

//prints contents of the table
foreach (object y in itable) {
    string value = (string)y.GetType().GetProperty("ColumnName").GetValue(y, null);
    Console.WriteLine(value);
}

//inserting into a table
dynamic tableClass = Activator.CreateInstance(tableType);
//Alternative to using tableType
dynamic tableClass = Activator.CreateInstance(null, "NameSpace.TableName").Unwrap();
tableClass.Word = userParameter;
itable.InsertOnSubmit(tableClass);
dbcontext.SubmitChanges();

//sql equivalent
dbcontext.ExecuteCommand("INSERT INTO [TableName]([ColumnName]) VALUES ({0})", userParameter);