C# 当我将表名作为字符串时,如何创建LINQ to SQL语句?

C# 当我将表名作为字符串时,如何创建LINQ to SQL语句?,c#,linq,linq-to-sql,C#,Linq,Linq To Sql,如果我有如下数据库表的名称: string tableName = "Addresses"; string tableName = "Customers"; var items = from o in db.{tableName} select o; foreach (var item in items) { sb.Append(item.Id + Environment.NewLine); } IEnumerable<Customer> res

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

string tableName = "Addresses";
string tableName = "Customers";
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");
如何构造如下所示的动态LINQ语句:

string tableName = "Addresses";
string tableName = "Customers";
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");
我知道我可以这样做:

string tableName = "Addresses";
string tableName = "Customers";
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");

LINQtoSQL是强类型的,所以我认为除非使用ExecuteQuery,否则不能使用LINQtoSQL来使用动态表名


谢谢

您可以使用动态Linq查询库(简称D-Linq)


对不起-我现在不在开发机器旁,但能帮忙吗

似乎建议您使用DynamicQuery

另一种方式——正如 我上一篇文章中的几个评论者 -就是使用DynamicQuery。DynamicQuery是随安装的示例之一 101个LINQ样本,您可以找到 通过单击中的“帮助|示例”进行编辑 Visual Studio。如果你钻到 示例文件夹有一个动态查询 示例项目,基本上 由提供 基于字符串的lambda表达式 解析

类DynamicQuery类是self 包含,您只需将其添加到 你的项目。它提供了额外的 允许您使用 各种类型的字符串表达式 包括.Where()的查询方法 方法(但不幸的是 上面的示例不是.Single() 方法)。因此,使用动态查询 Load()方法也可以是 内容如下:


文章中也有一个实际的代码示例…

我认为动态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;
var items=来自MagicTableResolver(“产品”)中的p

其中p.Firstname/如果您想要记录集,您可以访问
DataContext
类的属性(
db
变量在您的上下文中),并使用它执行常规查询,并在和的基础上在
DataTable
DataReader

中获取结果,下面是如何在字符串表名上运行一些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);

我想你可以在这里使用反射来获得正确表类的句柄。爱德华:我建议你使用“using”块来确保连接,datareader被关闭(包括在异常情况下)。如果你已经生成了DataContext,并且在其他地方使用,我建议您使用DataContext.ExecuteQuery来保持一致性。此方法具有返回对象的重载!我要补充的是,如果没有关于被查询表的信息,构建表达式树是不可能的,我不认为有一种机制可以根据表名动态获取它们。对,但我只是认为会有一个db.ExecuteQuery.GetUntypedDataTable()或者诸如此类的东西,如果需要的话,您可以访问这些表,这是我目前的解决方案,只需要获取连接字符串并绕过LINQ。或者正如我所说的,使用ExecuteQuery方法。