在这里输入代码在我的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
答案 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模型直接访问该值。