给出下表:
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中做到这一点。
我不认为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());