1

配列に対して LinQ クエリを作成し、複数の列を返したいと考えています。なかなかうまくいかず、いろいろ試してみました。

まず、配列には、次のようなテーブルのタイプとバージョンが含まれています。

TypeID-------VersionID-------Text
1            1               "Version 1.1"
2            1               "Version 2.1"
3            1               "Version 3.1"
3            2               "Version 3.2"

これは SQL テーブルで、次のクエリを使用して最新バージョンを簡単に取得できます。

SELECT 
        V.*
FROM Table V
WHERE V.VersionID IN (SELECT MAX(VersionID) GROUP BY TypeID)

しかし、私はこれをLinQでやりたいのですが、それは私を殺しています。私はそれを理解することはできません。すべての値が必要です。したがって:

public MyStruct
{
   public int TypeID,
   public int VersionID,
   public string Text
}

MyStruct[] array = new MyStruct[4];
array[0].TypeID = 1;
array[0].VersionID = 1;
array[0].Text = "Version 1.1";
array[1].TypeID = 2;
array[1].VersionID = 1;
array[1].Text = "Version 2.1";
array[2].TypeID = 3;
array[2].VersionID = 1;
array[2].Text = "Version 3.1";
array[3].TypeID = 3;
array[3].VersionID = 2;
array[3].Text = "Version 3.2";

ここで、バージョン 1.1、バージョン 2.1、およびバージョン 3.2 を含む 3 つの要素のみを持つ結果の配列が必要です。Version 3.1 は「古いバージョン」なので無視したい。

私のLinQは次のようなものです:

var myArrayQuery = from arr in array
group arr by arr.TypeID into arrGroup
select new
{
   TypeID = arrGroup.Key,
   VersionID = (int)arrGroup.Max(mx=>mx.VersionID)
   // -- GET THE TEXT HERE ---
};

テキストの入手方法がわかりません!

私が試してみました:

var myArrayQuery = from arr in array
group arr by new{ arr.TypeID, arr.VersionID, arr.Text} into arrGroup
select new
{
   TypeID = arrGroup.TypeID,
   VersionID = (int)arrGroup.Max(mx=>mx.VersionID),
   Text = arrGroup.Text
};

しかし、その後、 4 つの配列要素すべてが返されます。したがって、ダメです。思うようにMAXにならない。

助けてください!

ありがとう。

4

1 に答える 1

2

使用する

Text = arrGroup.OrderByDescending(mx=>mx.VersionID).First().Text

完全なクエリ:

var myArrayQuery = from arr in array
group arr by arr.TypeID into arrGroup
select new
{
   TypeID = arrGroup.Key,
   VersionID = (int)arrGroup.Max(mx=>mx.VersionID),
   Text = arrGroup.OrderByDescending(mx=>mx.VersionID).First().Text
};
于 2013-08-12T18:58:28.583 に答える