1

次の SQL を Linq に変換しようとしていますが、最小値を適用しようとすると混乱します。基本的に、ビームとその許容荷重を含むテーブルがあります。次に、データベースにクエリを実行し、必要な強度を持つ最小のビームをタイプ別に検索します。次の t-SQL

select
    sed.SEDetailID
from
    dbo.StructuralElementDetail sed
    inner join (select StructuralElementID, min(Ix) as MinIX from dbo.StructuralElementDetail where Ix >= @iRequired group by StructuralElementID) o
        on sed.StructuralElementID = o.StructuralElementID
            and sed.Ix = o.MinIX
order by
    StructuralElementID,
    Sequence;

必要な強度を持つ最小のビームをタイプ別に返します。

ID をキーとするディクショナリに既にビームがロードされているので、データベースに別の呼び出しを行うのではなく、そのオブジェクトをクエリできるはずだと考えました。

私の辞書は

Dictionary<int, Beam>;

私はこのようなことを試みていますが、各タイプで最小のビームを取得する方法が混乱しています。

            var Beams = db.Values.Where(specificBeam => specificBeam.Ix >= iRequired)
                .GroupBy(specificBeam => specificBeam.ElementType)
                    .Select(sb => new { sb.Key, MinIActual = sb.Min(specificBeam => specificBeam.Ix) });

ポインタはありますか?と組み合わせて First をネストできますか

4

1 に答える 1

2

これは、こちらの LINQPad の例でテストされています。

var smallestBeamForTypes = 
    from anyBeam in db.Values
    where anyBeam.Ix >= iRequired
    group anyBeam by anyBeam.ElementType into beamTypeGroup
    let minIx = beamTypeGroup.Min(beam => beam.Ix)
    select new {
        ElementType = beamTypeGroup.Key,
        SmallestBeam = beamTypeGroup.First(beam => beam.Ix == minIx)
    };

その後、次のようにループできます。

foreach(var smallestBeamForType in smallestBeamForTypes)
{
    Console.WriteLine("For the element type {0} the smallest beam is {1}",
        smallestBeamForType.ElementType, smallestBeamForType.SmallestBeam);
}
于 2012-10-11T23:11:26.823 に答える