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

时间:2011-09-05 22:03:46

标签: c# .net linq linq-to-sql

在这里输入代码在我的SQL Server数据库中,我有subNumber(例如Unit 802)和streetNumber(例如242 Elizabeth Street)的地址信息。

如果subNumber包含值,我需要将它们显示为一个(即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

3 个答案:

答案 0 :(得分:3)

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(),
            rnum = string.IsNullOrEmpty((p.subNumber).ToString()) ? (p.streetNumber).ToString() : (p.subNumber).ToString() + "/" + (p.streetNumber).ToString(),
            rstreet = p.street,
            rsuburb = p.suburb,
            rurl = p.propertyURL,
        };

答案 1 :(得分:0)

“select”中只需ternary conditional aka ?: operator即可:

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,这只是处理已经返回的数据,这里没有什么可担心的。

快乐的编码。

答案 2 :(得分:0)

在表级别,您可以创建一个计算列;这些都没有存储 - 查询列时“创建”值。

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模型直接访问该值。