Как я могу создать оператор LINQ-to-SQL, если у меня есть имя таблицы в виде строки? - PullRequest
3 голосов
/ 30 ноября 2009

Если у меня есть имя таблицы базы данных, например:

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");

Но в этом случае я не хочу строго типизированные объекты в качестве результата, я просто хочу, чтобы набор записей выделялся.

Ответ:

Спасибо, Шалкальпеш, я воспользовался вашим советом и решил это, просто полностью избегая 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 ]

4 голосов
/ 30 ноября 2009

Если вам нужен набор записей, вы можете получить доступ к свойству Connection класса DataContext (переменная db в вашем контексте) и использовать его для выполнения обычного запроса и получения результата в либо DataTable, либо DataReader.

1 голос
/ 30 ноября 2009

Извините - в данный момент я не в сети, но может ли помочь?

Похоже, вы должны использовать DynamicQuery ...

Другой способ - как упоминалось несколько комментаторов в моем предыдущем посте - это использовать DynamicQuery. DynamicQuery - один из примеров, установленных с 101 образец LINQ, и вы можете найти это, нажав на Помощь | Образцы в Visual Studio. Если вы сверлите в Примеры папок есть DynamicQuery пример проекта, который в основном состоит из класса, который обеспечивает лямбда-выражение на основе строки разбора.

Класс DynamicQuery является классом self содержится, и вы можете просто добавить его в ваш проект. Это обеспечивает дополнительные методы расширения, которые позволяют вам использовать строковые выражения для различных методы запроса, включая .Where () метод (но, к сожалению, для приведенный выше пример не .Single () метод). Так что с динамическим запросом выше .Load () метод также может быть записано следующим образом:

На посте тоже есть пример кода ...

1 голос
/ 30 ноября 2009

Вы можете использовать библиотеку динамических запросов Linq (или D-Linq для краткости).

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

0 голосов
/ 01 декабря 2013

Построение из этого и этого , вот как выполнить некоторые команды 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);
0 голосов
/ 30 ноября 2009

Я не думаю, что 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;
0 голосов
/ 30 ноября 2009

LINQ to SQL предназначен для строгой типизации, поэтому я не думаю, что вы можете использовать LINQ to SQL для использования динамических имен таблиц, если не используете ExecuteQuery

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...