我有一个数据库表,其中有100个列,标记为D1、D2、D3等。
在我的方法(ASP.NET MVC)中,我需要检查这些列是否为null,然后在视图中的表中显示它们。我真的不想做这个
if(db.Datatable.Select(x=>x.D1).FirstOrDefault() != null)
{
//do code
}
if(db.Datatable.Select(x=>x.D2).FirstOrDefault() != null)
{
//do code
}
if(db.Datatable.Select(x=>x.D3).FirstOrDefault() != null)
{
//do code
}
如果声明和看起来很糟糕的话,那将是100。所以我在这里开始了这段代码:
for(int i = 1; i < 100; i++)
{
var dbField = "D" + i; //D1,D2,D3....
var currField = db.Datatable.Select(x => x.dbField).FirstOrDefault();
//here i would add the value (0 for null, 1 for data) to an array, which i would handle in the view
}
除了LINQ/C#不喜欢这个。显然,它会在Select语句中对dbField引发错误。您不能只设置.Select(x=x.variable)。我读过关于创建自己的lambda表达式树和构建自定义动态查询的文章,有关于如何做到这一点的想法吗?如何自定义为Select语句创建字段名?谢谢。
发布于 2020-04-02 14:14:15
没有理由重复从同一个不变的集合中获取第一个元素。简单地从集合中获取第一个元素,然后处理检索到的对象:
var element = db.Datatable.FirstOrDefault();
这已经极大地简化了您的代码并提高了性能(因为您不需要迭代每个属性的集合):
if(element.D1 != null)
{
//do code
}
// and so on...
现在还不清楚为什么需要确定每个字段都包含一个非空值。您从未发布过任何显示如何使用这些值的代码。
//here i would add the value (0 for null, 1 for data) to an array, which i would handle in the view
通常,最好只使用来确保视图能够处理空值,因为这意味着当某个值为null时,您不需要担心代码的执行。
如果这是不可能的,那么简单地将null
值转换为默认的非空值仍然更容易。这意味着您仍然不必担心空值(在您转换它们之后),因为您将不再有任何空值。
要做到这一点,一个简单的方法是使用空合并运算符。
var firstName = element.D1 ?? String.Empty;
这可以确保null
值被默认值替换(您可以指定这个值,我只是在这里选择了一个空字符串,但是您可以任意选择)。
还要注意,对于非空值(如int
),甚至不需要这样做,因为这些值将自动默认为0
。
//here i would add the value to an array
为什么使用数组而不是对象?不清楚为什么手动处理每个属性(及其值)而不是单独传递对象,这是传递数据的更好的OOP方式。
同时希望手动处理所有数据,同时也不想处理所有这些数据,这是矛盾的。
发布于 2020-04-02 13:49:52
我认为,如果你能更准确地解释你想做什么,我们就能更好地帮助你。
当我看到您的代码时,我推断您的视图中的表将只显示一条带有他的适当属性/列的记录。如果你想这么做,没关系。
另一方面,根据列数对表进行迭代是个坏主意,因为您是在耦合两个抽象级别。我的意思是,您的MVC方法不应该了解列的数量,这就是您使用"for(int = 1;i< 100;i++)“所做的事情。实际上,如果存在表模式更新和列数更改,会发生什么情况?列的名称也一样吗?你的密码会被破坏的!
我认为你把这个问题从错误的一面转移到了我身上。
https://stackoverflow.com/questions/60980165
复制相似问题