3

誰かがlinqtoエンティティでこれを行うためのよりきちんとした方法を持っていますか?

X、Y、またはZが最も高い各グループのアイテムを取得しようとしています(例:Max(X、Y、Z))。

var points = from g in groupedData
             from ep in g
             where (ep.X > ep.Y ?
                               ep.X > ep.Z ? ep.X : ep.Z
                             : ep.Y > ep.Z ? ep.Y : ep.Z)
             == g.Max(e => e.X > e.Y ?
                           e.X > e.Z ? e.X : e.Z
                             : e.Y > e.Z ? e.Y : e.Z)
             select ep;
4

3 に答える 3

3
var points = from g in groupedData
             let gMax = g.Max(e => e.X > e.Y ?
                                    (e.X > e.Z ? e.X : e.Z)
                                  : (e.Y > e.Z ? e.Y : e.Z))
             from ep in g
             where ep.X == gMax
                   || ep.Y == gMax
                   || ep.Z == gMax
             select ep;

PS:Linq2SQLまたはLinq2Entities?「EF」にフラグを付けたからです!

編集:私はこれを成功裏にテストしました:

var points = from g in groupedData
             let gMax = g.Max(e => new int[] { e.X, e.Y, e.Z }.Max())
             from ep in g
             where ep.X == gMax
                   || ep.Y == gMax
                   || ep.Z == gMax
             select ep;

あなたのケースでそれが機能することを確認しますか?

于 2013-02-28T16:13:15.320 に答える
0

疑問符とコロンを本当に削除したい場合は、これを試すことができます。

var points = from g in groupedData
         from ep in g
         select ep).OrderByDescending(x => x.GetType().GetProperties().Max(y => y.GetValue(x,null))).FirstOrDefault());

説明:

これは基本的にリフレクションを使用してアイテム内のプロパティのリスト(この場合はX、Y、Z)を取得し、プロパティ間の最大値に基づいてアイテムを並べ替えます。次に、リストから最初の1つを選択します。これは、プロパティが最も高いアイテムである必要があります。

これの良い面は、もう1つのプロパティ(たとえばK)を追加することにした場合、何も変更する必要がないことです。(疑問符とコロンを使用した比較にKも追加したい場合は、何をしなければならないか想像してみてください)。

注: クラス内に比較で使用したくない他のプロパティがある場合は、次のように追加できますx.GetType().GetProperties()

x.GetType().GetProperties().Select(prop =>prop.PropertyType.Name.Equals("Int32"))

これは整数プロパティのみを取得します。必要な場合にのみ使用するか、無視してください。

それが役に立ったことを願っています

于 2013-02-28T17:22:01.940 に答える
0

私はそれを処理するための拡張メソッドを作成します

public static int Max(params int[] a)
{
    return a.Max();
}

またはそれらの線に沿った何か

その後、次のように使用します

var largestNumber = Max(1,2,3,4,5);

また

Max(ep.X,ep.Y,ep.Z) == Max(e.X,e.Y,e.Z)
于 2013-02-28T16:13:49.067 に答える