小编典典

LINQ to SQL C#粗疏

sql

给出下表:

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中做到这一点。


阅读 177

收藏
2021-04-14

共1个答案

小编典典

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

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

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());
2021-04-14