c# - LINQ to Entities 在运行时更改实体
问题描述
我有个问题。我有一个 dbContext,它有 200 多个类,代表数据库中的所有表。所有表格都遵循相同的格式。是否可以通过以下方式在运行时动态更改代码?
var coffeeList = new ObservableCollection<GenericCoffeeList>();
var query = (from c in ctxCoin.Coffee1
select new GenericCoffeeList { CoffeeCatalogId = c.Id, Name = c.Name, Type = c.Type })
.ToList();
foreach (var c in query)
{
coinList.Add(c);
}
这是下一个几乎相同的实体类型。唯一的变化是实体
var coffeeList = new ObservableCollection<GenericCoffeeList>();
var query = (from c in ctxCoin.Coffee2
select new GenericCoffeeList { CoffeeCatalogId = c.Id, Name = c.Name, Type = c.Type })
.ToList();
foreach (var c in query)
{
coinList.Add(c);
}
有没有办法在运行时更改实体,或者我必须对每个实体进行编码?感谢您对这个问题的任何指导。
解决方案
这应该工作:
var coffeeRepoList = new List<IQueryable<ICoffee>>()
{
ctxCoin.Coffee1,
ctxCoin.Coffee2,
//...
ctxCoin.CoffeeN,
};
var coffeeList = (
from coffeeRepo in coffeeRepoList
from coffee in coffeeRepo
select new GenericCoffeeList
{
CoffeeCatalogId = coffee.Id,
Name = coffee.Name,
Type = coffee.Type
}).ToList();
public interface ICoffee // make all your entities implement this
{
int Id { get; set; }
string Name { get; set; }
string Type { get; set; }
}
public partial class Coffee1 : ICoffee { }
public partial class Coffee2 : ICoffee { }
//...
public partial class CoffeeN : ICoffee { }
您可以在数据库中运行此查询生成 coffeeRepoList:
"SELECT ' ctxCoin.' + name + ',' FROM sys.tables ORDER BY name"
它会生成这个:
ctxCoin.Coffee1,
ctxCoin.Coffee2,
//...
ctxCoin.CoffeeN,
或使用反射:
public static List<IQueryable<ICoffee>> GetCoffeeDbSets(DbContext ctxCoin)
{
return (
from property in ctxCoin.GetType().GetProperties()
where typeof(IQueryable<ICoffee>).IsAssignableFrom(property.PropertyType)
select (IQueryable<ICoffee>)property.GetValue(ctxCoin)).ToList();
}
要使您的所有实体实现该接口,您可以使用此查询:
"SELECT 'public partial class ' + name + ' : ICoffee { }' FROM sys.tables ORDER BY name"
它会生成这个:
public partial class Coffee1 : ICoffee { }
public partial class Coffee2 : ICoffee { }
//...
public partial class CoffeeN : ICoffee { }
推荐阅读
- android-studio - 任何人都可以帮助我尝试调用虚拟方法“void android.widget.TextView.setText(java.lang.CharSequence)”空对象
- c# - 使用 C# 通过 Web 套接字的桌面应用程序的 WebRTC 客户端代码
- python - Python RotatingFileHandler 不旋转
- c - 在 C 编程中创建指向文件的指针数组
- kubernetes - 如何在 k8s 中的两个不同部署之间定义共享持久卷?
- javascript - 获得嵌套承诺的最终价值
- asp.net-mvc - 通过 aspnet_regiis.exe 在 ASP.NET MVC 中加密的 Web.config 抛出错误
- c# - 遍历 DataGridView
- visual-studio-code - 如何使用 mrcrowl 插件在 VS Code 中创建新的 Mercurial 分支?
- python - 正则表达式删除整个外部父模式,但仍保留子模式内的数据。嵌套模式