Необходимо объединить две строки, если обе содержат значения, или вернуть одно значение, если first равен NULL - PullRequest
2 голосов
/ 06 сентября 2011

введите код здесь. В моей базе данных SQL Server мои адресные данные для под-номера (например, Unit 802) и streetNumber (например, 242 Elizabeth Street) хранятся отдельно.

Мне нужно отобразить их как один (т.е.802/242 Elizabeth Street), если subNumber содержит значение, в противном случае просто верните streetNumber, если его нет.

Я работал над решением, использующим IF ELSE и цикл foreach после доступа к данным через LINQ- но я застрял после того, как я завершил цикл.Я также был бы рад сделать это с помощью хранимой процедуры SELECT в SQL - открытой для предложений!

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 ]

3 голосов
/ 06 сентября 2011

1001 * попробовать *

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,
        };
0 голосов
/ 06 сентября 2011

На уровне таблицы вы можете создать вычисляемый столбец; они не сохраняются - значение «создается» при запросе к столбцу.

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.

0 голосов
/ 06 сентября 2011

Просто троичный условный aka?: Оператор в поле «select» должен сделать:

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, так как это просто обработка данных, которые уже были возвращены , тогда здесь не о чем беспокоиться.

Удачного кодирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...