繁体   English   中英

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

[英]How to dynamically query the database using LINQ and a variable?

我有一个数据库表,它有 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 语句自定义创建字段名称? 谢谢你。

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

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

通常,最好简单地确保您的视图可以处理 nulls ,因为这意味着您无需担心在某个值为 null 时执行的代码。

如果这是不可能的,那么简单地将null值转换为默认的非空值仍然更容易。 这意味着您仍然不必担心空值(在您转换它们之后),因为您将不再有任何空值。

一个简单的方法是使用空合并运算符,例如

var firstName = element.D1 ?? String.Empty;

这确保null值被替换为默认值(您可以指定,我只是在这里选择了一个空字符串,但您可以选择任何您想要的)。

另请注意,您甚至不需要为不可空值(例如int执行此操作,因为这些值将自动默认为0

//here i would add the value to an array

为什么使用数组而不是对象? 目前尚不清楚为什么您对手动处理每个属性(及其值)而不是通过自身传递对象感到死板,这无疑是传递数据的更好的 OOP 方式。

既想手动处理所有数据又不想处理所有数据是矛盾的。

我想如果你更准确地解释你想做什么,我们将能够更好地帮助你。

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

另一方面,根据列数迭代表是一个坏主意,因为您正在耦合两个抽象级别。 我的意思是你的 MVC 方法不应该知道列数,这就是你正在做的“for(int i = 1; i < 100; i++)”。 确实,如果表模式更新并且列数发生变化会发生什么? 列的名称相同吗? 你的代码会被破解!

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM