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