如何将多个字段连接成1个结果?

时间:2013-11-05 21:32:16

标签: c# linq

我们在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指定的顺序)?如果是这样,那怎么办?

2 个答案:

答案 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中的所有DisplayOrderSELECT 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}}