3

给定下表:

Length | Width | Color | ID
===========================
    18 |    18 |  blue |  1
---------------------------
    12 |    12 |   red |  1
---------------------------

我想生成单列/行:

 SIZES
 =================
 18 x 18, 12 x 12,

我可以在 SQL 中执行以下操作:

DECLARE @SIZES VARCHAR(8000)
SELECT @SIZES = COALESCE(@SIZES, '') + Convert(varchar(80), [Length]) + ' x ' + 
                Convert(varchar(80), [Width]) + ', '
FROM table
where ID = 1
GROUP BY [Length], [Width]
ORDER BY [Length], [Width]
SELECT SIZES = @SIZES

但我无法弄清楚如何在 LINQ 中执行此操作。

我得到的最接近的是:

from t in table
where id == 1
group t by new {
                 t.Length,
                 t.Width
               } into g
orderby g.Key.Length, g.Key.Width
select new {
             SIZES = (Convert.ToInt32(g.Key.Length) + " x " +
                      Convert.ToInt32(g.Key.Width) + ", ")
           }

产生一列和两行:

SIZES
========
18 x 18,
12 X 12,

皈依者对问题并不重要。尽管所有列都是整数,但这些列被定义为浮点数。关键是 COALESCE 函数,我无法弄清楚如何在 LINQ 中做到这一点。

4

4 回答 4

10

尝试??空合并运算符),如:

t.Length ?? 0
于 2009-08-07T15:50:02.413 回答
1

我不认为 LINQ to SQL 支持这种 T-SQL 技巧。COALESCE 并不是真正的问题(Mehrdad 指出 C# 中的等价物是 ??)——事实上,SQL Server 通过字符串连接将每个结果聚合到变量 @SIZES 中。AFAIK LINQ to SQL 无法构造此类查询。

这将产生您想要的结果,但字符串连接是在您这边执行的,而不是在 SQL 服务器那边。那可能没关系。

var query = 
    from t in table
    where id == 1
    group t by new {
                 t.Length,
                 t.Width
               } into g
    orderby g.Key.Length, g.Key.Width
    select new {
             SIZES = (Convert.ToInt32(g.Key.Length) + " x " +
                      Convert.ToInt32(g.Key.Width) + ", ")
           };

var result = string.Join(string.Empty, query.Select(r => r.SIZES).ToArray());
于 2009-08-07T15:54:28.347 回答
0

我只会int从 SQL 返回大小并在客户端构建字符串:

var query = 
    from t in table
    where id == 1
    group t by new {
                 t.Length,
                 t.Width
               } into g
    orderby g.Key.Length, g.Key.Width
    select g.Key;

var sizeStrings = from s in query.AsEnumerable()
                  select string.Format("{0} x {1}", s.Length, s.Width);

var result = string.Join(", ", sizeStrings.ToArray());
于 2009-08-07T16:11:04.057 回答
0

您可以使用 .Aggregate 函数,如下所示:

(from t in table
where id == 1
group t by new {
             t.Length,
             t.Width
           } into g
orderby g.Key.Length, g.Key.Width
select new {
         SIZES = (Convert.ToInt32(g.Key.Length) + " x " +
                  Convert.ToInt32(g.Key.Width) + ", ")
       }).Aggregate((x,y) => x + y)

这应该像你想要的那样踢出一个字符串。聚合只是在内部维护您在 SQL 中定义的完全相同的变量,只是隐式的。

于 2016-06-09T17:00:53.230 回答