1

「LengthDatas」というオブジェクトと、文字列値である「AbsoluteCounter」というプロパティ/列を持つ Entity Framework コンテキストがあります。文字列値は 10 進数を表します。ラムダ式を使用して最大のものを見つけたいと思います。これを達成するために式をどのように変更しますか?

context.LengthDatas.Where(c => c.AbsoluteCounter.Last())

(列は 10 進数でなければならないことはわかっているので、後でこれを 10 進数値に変換します)

ありがとう

4

3 に答える 3

1

データの形式が正しくない場合 (先頭のスペース、英字)、文字列による並べ替えは失敗する可能性があります。データをメモリに入れる余裕がある場合は、これで抜け穴がなくなるはずです。

        var result = db.LengthDatas
            .ToList()
            .Select(c =>
            {
                decimal d;
                Decimal.TryParse(c.AbsoluteCounter, out d);
                return d;
            })
            .Max();

ただし、データの品質に自信がある場合は、そのまま使用してください

        var result1 = db.LengthDatas.Max(c => c.AbsoluteCounter);

補遺

メモリ内ではなくサーバー上で文字列を 10 進数に変換することについての議論を締めくくるために、@MarcinJuraszek が参照している上記の手法を試しました。

Code First アプリでテストしていますが、プロジェクトに ADO.Net Entity Data Model を追加して EDMX を追加しました。整理しなければならないことがいくつかありますが、基本的には次のタイプのクエリが機能します。

var result = db.LengthDatas.Max(c => EdmxExtensions.DecimalParse(c.AbsoluteCounter));

Linq to Entities によって生成される SQL は次のとおりです。

SELECT 
[GroupBy1].[A1] AS [C1]
FROM ( SELECT 
    MAX( CAST( [Extent1].[AbsoluteCounter] AS decimal(12,2))) AS [A1]
    FROM [dbo].[LengthDatas] AS [Extent1]
)  AS [GroupBy1]

ただし、これは c# Decimal.TryParse で得られるような堅牢な変換ではないことに注意してください。不正な文字列で例外がスローされます。

于 2013-04-12T13:48:02.353 に答える