В LINQ-to-SQL есть определенные способы сделать это из контекста данных; в основном db.GetTable
. Это возвращает ITable
, но работать с нетипизированным ITable
немного сложно. Вы можете перечислить это, по крайней мере ...
Чтобы получить ITable
, вам обычно требуется Type
, который вы можете получить (например) Assembly.GetType
:
using (var ctx = new MyDataContext()) {
string name = "Customer"; // type name
Type ctxType = ctx.GetType();
Type type = ctxType.Assembly.GetType(
ctxType.Namespace + "." + name);
ITable table = ctx.GetTable(type);
foreach(var row in table) {
Console.WriteLine(row); // works best if ToString overridden...
}
}
Конечно, когда у вас есть Type
, вы используете Activator
для создания новых экземпляров сущности:
object newObj = Activator.CreateInstance(type);
// TODO: set properties (with reflection?)
table.InsertOnSubmit(newObj);
но если вы хотите использовать имя свойства, это тоже может сработать:
using (var ctx = new MyDataContext()) {
string name = "Customers"; // property name
ITable table = (ITable) ctx.GetType()
.GetProperty(name).GetValue(ctx, null);
foreach (var row in table) {
Console.WriteLine(row); // works best if ToString overridden...
}
}
Запустить фильтры (Where
) и т. Д. Сложно с нетипизированными данными, поскольку сборка Expression
была бы сложной. Я бы, вероятно, начал переключаться на типизированную модель в этот момент ...