Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用LINQ和变量动态查询数据库?_C#_Sql_Asp.net Mvc_Linq - Fatal编程技术网

C# 如何使用LINQ和变量动态查询数据库?

C# 如何使用LINQ和变量动态查询数据库?,c#,sql,asp.net-mvc,linq,C#,Sql,Asp.net Mvc,Linq,我有一个数据库表,它有100列,标记为D1、D2、D3等等 在我的方法ASP.NET MVC中,我需要检查这些列是否为null,然后才能在视图中的表中显示它们。我真的不想这样做: 如果你的陈述看起来很可怕,那就有100条了。所以我在这里开始了这段代码: for(int i = 1; i < 100; i++) { var dbField = "D" + i; //D1,D2,D3.... var currField = db.Datatable.Se

我有一个数据库表,它有100列,标记为D1、D2、D3等等

在我的方法ASP.NET MVC中,我需要检查这些列是否为null,然后才能在视图中的表中显示它们。我真的不想这样做:

如果你的陈述看起来很可怕,那就有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上抛出一个错误。您不能只设置.Selectx=x.variable。我已经读过关于创建自己的lambda表达式树和构建自定义动态查询的内容,您有什么想法吗?如何自定义创建Select语句的字段名?谢谢。

我想如果你能更准确地解释一下你认为你想做什么,我们就能更好地帮助你

当我看到您编写代码时,我推断视图中的表将只显示一条具有适当属性/列的记录。如果你想那样做,没关系

另一方面,根据列数迭代表是一个坏主意,因为您要耦合两个抽象级别。我的意思是,你的MVC方法不应该知道列的数量,这就是你对forint i=1所做的;i<100;i++。 事实上,如果有一个表模式更新,并且列的数量发生了变化,会发生什么呢? 列的名称是否相同?你的密码将被破解


我认为你把问题从错误的方面推给了我。

我认为如果你能更准确地解释你认为你想做什么,我们就能更好地帮助你

当我看到您编写代码时,我推断视图中的表将只显示一条具有适当属性/列的记录。如果你想那样做,没关系

另一方面,根据列数迭代表是一个坏主意,因为您要耦合两个抽象级别。我的意思是,你的MVC方法不应该知道列的数量,这就是你对forint i=1所做的;i<100;i++。 事实上,如果有一个表模式更新,并且列的数量发生了变化,会发生什么呢? 列的名称是否相同?你的密码将被破解


我认为你把问题从错误的方面推给了我。

没有理由重复从同一个不变的集合中获取第一个元素。Simple从集合中获取第一个元素,然后使用检索到的对象:

var element = db.Datatable.FirstOrDefault();
这已经极大地简化了代码并提高了性能,因为您不需要迭代每个属性的集合:

if(element.D1 != null)
{
    //do code
}

// and so on...
现在还不清楚为什么需要确定每个字段都包含一个NOTNULL值。您从未发布过任何显示您打算如何使用这些值的代码

//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;
这确保了空值被一个默认值替换,您可以指定该值。我在这里选择了一个空字符串,但您可以选择任何您想要的

还要注意,对于int等不可为空的值,甚至不需要这样做,因为这些值将自动默认为0

//here i would add the value to an array
为什么使用数组而不是对象?现在还不清楚为什么手动处理每个属性及其值而不是单独传递对象是死气沉沉的,这无疑是传递数据的更好的OOP方式


这与同时希望手动处理所有数据,又不希望必须处理所有数据相矛盾。

没有理由重复从相同的不变集合中获取第一个元素。Simple从集合中获取第一个元素,然后使用检索到的对象:

var element = db.Datatable.FirstOrDefault();
这已经极大地简化了代码并提高了性能,因为您不需要迭代每个属性的集合:

if(element.D1 != null)
{
    //do code
}

// and so on...
现在还不清楚为什么需要确定每个字段都包含一个NOTNULL值。您从未发布过任何显示您打算如何使用这些值的代码

//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;
这确保了空值被一个默认值替换,您可以指定该值。我在这里选择了一个空字符串,但您可以选择任何您想要的

还要注意,对于int等不可为空的值,甚至不需要这样做,因为这些值将自动默认为0

//here i would add the value to an array
为什么使用数组而不是对象?现在还不清楚为什么手动处理每个属性及其值而不是单独传递对象是死气沉沉的,这无疑是传递数据的更好的OOP方式


这与同时希望手动处理所有数据,又不希望必须处理所有数据是矛盾的。

您所说的记录是什么意思?这是指任何给定行中的行或列值吗?对不起,我是指列。编辑原始帖子我不确定FirstOrDefault是否在做你想做的事情,或者你需要什么还不清楚。它应该返回第一行的值,例如D1-您只是想检查第一行是否有列的值吗?嗯,为什么要这样做?这将在功能上执行单个sql查询,以获取循环中的第一条记录和第x列。这意味着,如果有1000列,它将执行一个数据库选择,以获取每列的值,但所有值都用于同一条记录。更好的设计是获取整个第一条记录,然后迭代属性,并对每个属性执行X。var record=db.Datatable.first;ifrecord.D1!=无效的ifrecord.D2!=空…你说的记录是什么意思?这是指任何给定行中的行或列值吗?对不起,我是指列。编辑原始帖子我不确定FirstOrDefault是否在做你想做的事情,或者你需要什么还不清楚。它应该返回第一行的值,例如D1-您只是想检查第一行是否有列的值吗?嗯,为什么要这样做?这将在功能上执行单个sql查询,以获取循环中的第一条记录和第x列。这意味着,如果有1000列,它将执行一个数据库选择,以获取每列的值,但所有值都用于同一条记录。更好的设计是获取整个第一条记录,然后迭代属性,并对每个属性执行X。var record=db.Datatable.first;ifrecord.D1!=无效的ifrecord.D2!=无效的