1

我有一个实体框架上下文,其中包含一个名为“LengthDatas”的对象和一个名为“AbsoluteCounter”的属性/列,它是一个字符串值。字符串值表示十进制数。我想使用 lambda 表达式来查找最大的表达式。我将如何修改我的表达来实现这一点?

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

(我知道该列应该是十进制的,稍后我会将其转换为十进制值)

谢谢

4

3 回答 3

2

使用OrderByDescendingFirst(OrDefault)组合:

context.LengthDatas.OrderByDescending(c => c.AbsoluteCounter).FirstOrDefault();

但是要真正获得十进制比较(而不是字符串),您必须定义自己的方法,如在组加入 linq 查询问题中将字符串转换为十进制的答案中所述。

于 2013-04-12T12:38:11.437 回答
2

您应该先执行此操作(切换到十进制),然后您可以轻松地将查询更改为:

context.LengthDatas.OrderByDescending(c => c.AbsoluteCounter))

如果 absolutecounter 是十进制的,那么查询将对它进行排序,第一个元素将是最大的

于 2013-04-12T12:39:46.473 回答
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);

附录

为了完善关于在服务器上而不是在内存中将字符串转换为十进制的讨论,我尝试了上面提到的@MarcinJuraszek 技术。

我在 Code First 应用程序中进行测试,但通过向项目添加 ADO.Net 实体数据模型来添加 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 回答