我的数据库中有一个表,其中包含大约 100 多列。
我有一个查询将从数据库中选择特定列。但我想以一种动态的方式来做。在 100 多列中,总会有 2 列存在,并且在 100 多列中还会多出一列。
目前我正在使用选择表达式
Expression<Fun<MyTable,MyDto>> Select = p => new MyDto() {
Column1 = p.Column1,
Column2 = p.Column2,
Extra = p.(on of the 100 Column)
}
但我想动态地将这个额外属性设置为其中一列。
类似的东西
if (SomeCondition) // This can an Enum or a String which will determine which column to chose
{
Select.Extra = (one of the 100 Column)
}
else {
Select.Extra = (one of the 100 Column)
}
有没有办法在运行时更新所选列?
所以我能够根据smoksnes的评论弄清楚事情。
但是我想分享我提出的解决方案以及我选择的解决方案
我的解决方案:
Expression<Fun<MyTable,MyDto> Select = p => new MyDto() {
Column1 = p.Column1,
Column2 = p.Column2,
Extra = p.GetType().GetProperty("ColumnNameToSelect").GetValue(p).ToString()
}
现在上面的解决方案可以工作,但与下面的解决方案相比,在处理 10000+ 大量行时,性能会很糟糕。
我采用的解决方案
_context.MyTable.Where(p => p.IsDeleted == false)
.Select<MyDto>($"new (Column1 as Column1,Column2 as Column2, Extra as {"ColumnNameToSelect"})")
.ToList()
上述解决方案具有更好的性能,因此请使用该解决方案,并且仅在满足您的用例的情况下才使用第一个解决方案。
这两个解决方案都可与 EF Core 配合使用,并且已在 NET 6 上进行了测试。 不知道其他版本。