[英]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.