我们在SQL Server中有一个表,如果这些文本框最初为空,那么这些表中的值将显示在几个文本框中。然后,用户可以向预加载的文本添加更多详细信息,或者删除它,无论如何。这是为了让用户启动。这是表的架构:
CREATE TABLE [dbo].[PreloadTextbox](
[PreLoadNumber] [smallint] NOT NULL,
[DisplayOrder] [smallint] NOT NULL,
[LineToDisplay] [varchar](100) NULL,
CONSTRAINT [PK_PreloadTextbox] PRIMARY KEY CLUSTERED
(
[PreLoadNumber] ASC,
[DisplayOrder] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]
此表最初用于多年前编写的VB6应用程序。我们使用C#在WPF中重写它。字段PreLoadNumber与它关联的文本框相关联,当然DisplayOrder是记录应该出现的顺序。我们应该做的是将表中的所有记录组合成1个大记录,从VARCHAR更改LineToDisplay (100)到VARCHAR(MAX),但是必须等到另一天,因为这个表仍然被旧的VB6应用程序使用。
所以我希望找到的是这个;是否可以使用LINQ将所有LineToDisplay组合成PreLoadNumber == 1(按DisplayOrder指定的顺序)?如果是这样,那怎么办?
答案 0 :(得分:1)
我认为你正在寻找这样的东西:
var results = dbContext.PreloadTextbox
.Where(x=> x.PreLoadNumber == 1)
.OrderBy(x=> x.DisplayOrder)
.Select(x=> x.LineToDisplay)
.ToArray();
//string array is joined here using a ",", change it as necessary
string output = string.Join(",", results);
答案 1 :(得分:1)
另一种解决方法可能是添加如下的SQL Server视图:
SELECT pt.PreLoadNumber AS [PreLoadNumber]
,( SELECT SUB.LineToDisplay AS [text()]
FROM [PreLoadTextbox] SUB
WHERE SUB.PreLoadNumber = pt.PreLoadNumber
ORDER BY SUB.DisplayOrder
FOR
XML PATH('')
) AS [LinesToDisplay]
FROM ( SELECT DISTINCT
PreLoadNumber
FROM [PreLoadTextbox]
) pt
这可能会提高性能,因为预编译了视图。该视图将为您提供一个包含PreLoadNumber
的两列视图,并且LineToDisplay
中的所有DisplayOrder
在SELECT pt.PreLoadNumber AS [PreLoadNumber]
,STUFF(( SELECT ',' + SUB.LineToDisplay AS [text()]
FROM [PreLoadTextbox] SUB
WHERE SUB.PreLoadNumber = pt.PreLoadNumber
ORDER BY SUB.DisplayOrder
FOR
XML PATH('')
), 1, 1, '' ) AS [LinesToDisplay]
FROM ( SELECT DISTINCT
PreLoadNumber
FROM [PreLoadTextbox]
) pt
中连接,而它们之间没有分隔符。如果您需要分隔符,可以使用:
{{1}}