-2

我目前在 db 表中有如下数据:

Data in table 
Desc       Value                                                                                                 
BNo        12 
CNo        Null 
ANo        15 
DNo        Null 
ENo        15 

如果 ANo 为空白,我需要显示 BNo。如果 BNo 为空白,则在表单上显示 CNo。一旦我发现基于定义的 DESC 优先级顺序的非空值(在这种情况下为 AE),我需要退出我的方法。如何实现这一点,我可以根据优先级硬编码 desc 名称,但它希望以更优化的方式实现。请提供任何建议。

4

3 回答 3

1

SQL 服务器

select top 1 *
from MyTable
where Value is not null
order by [Desc]

MySQL:

select *
from MyTable
where `Value` is not null
order by `Desc`
limit 1
于 2012-09-19T17:53:12.573 回答
0

正如您所说的“按优先顺序”,听起来您有办法对列表进行排序。不确定这个优先级是什么,但对于示例,我们假设它按“Desc”的字母顺序排列。我们还假设(为简单起见)这些值在字典中。鉴于此,您可以这样编写 Linq 语句...

dict.OrderBy(o => o.Key).FirstOrDefault(d => d != null);

例如...

Dictionary<string,string> dict = new Dictionary<string,string>();
dict.Add("BNo", "12");
dict.Add("CNo", null);
dict.Add("ANo", null);
dict.Add("DNo", null);
dict.Add("ENo", "16");

Debug.WriteLine(dict.OrderBy(o => o.Key).FirstOrDefault(d => d.Value != null));

这将返回第一个非空值。如果所有值都为 null,则返回 null。

这里可能有一些不正确的假设,但 OrderBy 和 FirstOrDefault 应该能够以任何必要的方式使用以实现您的目标。唯一需要更改的是“o.Key”和“d.Value”来引用您的实际属性。
例如,如果此信息在这样的类中...

class Info
{
    public string Desc { get; set; }
    public int? Number { get; set; }
}

你有一个清单,比如......

List<Info> info = new List<Info>();

那你可以写...

var returnValue = info.OrderBy(o => o.Desc).FirstOrDefault(d => d.Number.HasValue);
于 2012-09-19T18:03:49.010 回答
0

是表中Desc字段的ANo、BNo、CNo等值,还是表中的Desc、ANo、BNo..等字段。我有这个疑问,因为你只是这些实际上是联系方式。如果是第一个,RedFilter给你一个答案。如果是第二个,则可以选择动态查询。只需按优先级顺序将字段添加到数组中,然后迭代以构建查询。

于 2012-09-19T18:42:37.700 回答