【发布时间】:2020-07-13 18:00:49
【问题描述】:
我有一个包含 100 列的数据库表,标记为 D1、D2、D3 等等,直到 100。
在我的方法 (ASP.NET MVC) 中,我需要检查这些列是否为空,然后再将它们显示在我的视图中的表中。 我真的不想这样做:
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 个 if 语句,而且看起来很糟糕。所以我在这里开始这段代码:
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 语句创建字段名称?谢谢。
【问题讨论】:
-
记录是什么意思?这是否引用任何给定行中的行或列值
-
我的意思是列,对不起。编辑原帖
-
我不确定
FirstOrDefault是否按照您的想法行事(或者您需要什么不清楚)。它应该返回例如的值D1来自第一行 - 您只是想检查第一行是否有列的值吗? -
嗯,你为什么要这样做?这将在功能上执行单个 sql 查询以获取第一条记录,然后在循环中获取列 x。这意味着如果您有 1000 列,它会执行数据库选择以获取每列的值,但全部用于同一记录。更好的设计是获取 整个 第一条记录,然后遍历属性并为每个属性执行 X。
-
var record = db.Datatable.First(); if(record.D1 != null) ... if(record.D2 != null) ....
标签: c# sql asp.net-mvc linq