首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何使用LINQ和变量动态查询数据库?

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

Stack Overflow用户
提问于 2020-04-01 20:54:44
回答 2查看 400关注 0票数 2

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

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

代码语言:javascript
代码运行次数:0
运行
复制
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。所以我在这里开始了这段代码:

代码语言:javascript
代码运行次数:0
运行
复制
  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语句创建字段名?谢谢。

EN

回答 2

Stack Overflow用户

发布于 2020-04-02 14:14:15

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

代码语言:javascript
代码运行次数:0
运行
复制
var element = db.Datatable.FirstOrDefault();

这已经极大地简化了您的代码并提高了性能(因为您不需要迭代每个属性的集合):

代码语言:javascript
代码运行次数:0
运行
复制
if(element.D1 != null)
{
    //do code
}

// and so on...

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

代码语言:javascript
代码运行次数:0
运行
复制
//here i would add the value (0 for null, 1 for data) to an array, which i would handle in the view

通常,最好只使用来确保视图能够处理空值,因为这意味着当某个值为null时,您不需要担心代码的执行。

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

要做到这一点,一个简单的方法是使用空合并运算符。

代码语言:javascript
代码运行次数:0
运行
复制
var firstName = element.D1 ?? String.Empty;

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

还要注意,对于非空值(如int ),甚至不需要这样做,因为这些值将自动默认为0

代码语言:javascript
代码运行次数:0
运行
复制
//here i would add the value to an array

为什么使用数组而不是对象?不清楚为什么手动处理每个属性(及其值)而不是单独传递对象,这是传递数据的更好的OOP方式。

同时希望手动处理所有数据,同时也不想处理所有这些数据,这是矛盾的。

票数 0
EN

Stack Overflow用户

发布于 2020-04-02 13:49:52

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

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

另一方面,根据列数对表进行迭代是个坏主意,因为您是在耦合两个抽象级别。我的意思是,您的MVC方法不应该了解列的数量,这就是您使用"for(int = 1;i< 100;i++)“所做的事情。实际上,如果存在表模式更新和列数更改,会发生什么情况?列的名称也一样吗?你的密码会被破坏的!

我认为你把这个问题从错误的一面转移到了我身上。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60980165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档