如果我有这样的数据库表的名称:
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();
答案 0 :(得分:4)
如果您需要记录集,可以访问上下文中DataContext
类(db
变量)的Connection
属性,并使用它来执行常规查询并获取结果DataTable
或DataReader
。
答案 1 :(得分:1)
您可以使用Dynamic Linq查询库(或简称D-Linq)。
答案 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)
建立this和this,这里是如何在字符串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);