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) + ", ")
           }

これにより、1 つの列と 2 つの行が生成されます。

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

改宗者は問題にとって重要ではありません。列はすべて整数ですが、浮動小数点数として定義されています。キーは COALESCE 関数です。LINQ でそれを行う方法がわかりません。

4

4 に答える 4

10

??次のように( null 合体演算子) を試してください。

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

LINQtoSQLがこのT-SQLトリックをサポートしているとは思いません。COALESCEは実際には問題ではありません(MehrdadがC#で同等のものを指摘しているように??)-SQLServerが文字列連結を介して各結果を変数@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

SQL からサイズを返し、intクライアント側で文字列を構築します。

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 に答える