C# 如果两个字符串都包含值,则需要连接两个字符串;如果第一个字符串为NULL,则需要返回一个值

C# 如果两个字符串都包含值,则需要连接两个字符串;如果第一个字符串为NULL,则需要返回一个值,c#,.net,linq,linq-to-sql,C#,.net,Linq,Linq To Sql,在此输入代码我的SQL Server数据库我的子编号(如802单元)和街道编号(如242 Elizabeth Street)的地址信息分别存储 如果子编号包含值,我需要将其显示为一个,即802/242 Elizabeth Street,否则只需返回streetNumber(如果不包含) 在通过LINQ访问数据之后,我一直在致力于使用IF-ELSE和foreach循环的解决方案,但在完成循环之后,我陷入了困境。我也很乐意使用SQL中的SELECT存储过程来实现这一点-开放给建议 DataClass

在此输入代码我的SQL Server数据库我的子编号(如802单元)和街道编号(如242 Elizabeth Street)的地址信息分别存储

如果子编号包含值,我需要将其显示为一个,即802/242 Elizabeth Street,否则只需返回streetNumber(如果不包含)

在通过LINQ访问数据之后,我一直在致力于使用IF-ELSE和foreach循环的解决方案,但在完成循环之后,我陷入了困境。我也很乐意使用SQL中的SELECT存储过程来实现这一点-开放给建议

DataClassesDataContext dc = new DataClassesDataContext();

var recent = from p in dc.Properties
             orderby p.modtime descending
             where p.status == "Current"
             select new
             {
                 rsub = (p.subNumber).ToString(),
                 rnumber = (p.streetNumber).ToString(),
                 rstreet = p.street,
                 rsuburb = p.suburb,
                 rurl = p.propertyURL,
             };

foreach (var home in recent)
{
    if (string.IsNullOrEmpty(home.rsub))
    {
        string rnum = home.rnumber;
    }
    else
    {
        string rnum = home.rsub + "/" + home.rnumber;
    }
}

recentrepeater.DataSource = recent;
recentrepeater.DataBind();
Yahia给出了c语言中最好的选择-这是我最终得到的SQL解决方案:

ALTER PROCEDURE GetPropertyShort

AS
SELECT TOP 5 ISNULL(convert(varchar(5), subNumber) + '/' + convert(varchar(5), streetNumber), convert(varchar(5), streetNumber)) as Number, street, suburb, propertyURL, modtime
FROM Property
ORDER BY modtime DESC
试一试

只需选择中的一个选项即可:

select new
{
    house = p.subNumber != null
        ? p.subNumber + "/" + p.streetNumber
        : p.streetNumber;
    ...
};
这使得假设街道编号始终存在,否则可能导致xxx/或null。它还假设sub为null,如果确实不存在,则不只是空的

如果开始变得过于复杂,考虑下面的规则,这些规则与上面的规则稍有不同,剩下的要弄清楚:

select new
{
    house = PrettyHouseNumber(p.subNumber, p.streetNumber),
    ...
};

string PrettyHouseNumber(string sub, string street) {
    // ?: could also be used here as well, but since invoking the method
    // can be used as an expression itself, breaking it up like this also
    // allows the use of other constructs
    if (!string.IsNullOrEmpty(sub)) {
        return sub + "/" + street;
    } else {
        return "" + street; // NULL will go to "", if it can even ever come up
    }
}
这应该说明任何表达式(包括方法调用)都可以在那里使用——向它传递一些数据并返回一些数据:虽然表达式树有一些限制,哪些可以有效地转换为SQL,但由于这只是处理已经返回的数据,所以这里不需要担心


快乐编码。

在表级别,您可以创建一个计算列;未存储这些值-查询列时会“创建”该值

CREATE TABLE [Customer]
(
     [subNumber] NVARCHAR(256),
     [streetNumber] NVARCHAR(256),
     [fullAddress] AS (CASE 
                      WHEN [subNumber] IS NULL THEN [streetNumber]
                      ELSE [subNumber] + N' ' + [streetNumber]
                    END)
);
GO
也可以将其添加到表中:

ALTER TABLE [Customer]
   ADD COLUMN [fullAddress]
       AS (CASE 
            WHEN [subNumber] IS NULL THEN streetNumber
            ELSE [subNumber] + N' ' + streetNumber
          END);
GO

现在可以直接从您的EF模型中访问该值。

这可能是吹毛求疵,但您是否有充分的理由将其放在单独的列中,听起来您正遭受过度规范化。同意-这不是我的理想选择,但它必须将数据导出到另一个房地产目录,这些值是分开的…完美的Yahia-这正是我想要的!谢谢Jonathan,我实际上是通过一个存储过程来实现这一点的,但最终是这样实现的:改变过程GetPropertyShort AS SELECT TOP 5 ISNULLconvertvarchar5,subNumber+'/'+convertvarchar5,streetNumber,convertvarchar5,streetNumber AS Number,street,郊区,propertyURL,modtime FROM Property ORDER BY modtime DESC
ALTER TABLE [Customer]
   ADD COLUMN [fullAddress]
       AS (CASE 
            WHEN [subNumber] IS NULL THEN streetNumber
            ELSE [subNumber] + N' ' + streetNumber
          END);
GO