C# 我需要帮助在实体框架上下文中使用lambda表达式查找记录

C# 我需要帮助在实体框架上下文中使用lambda表达式查找记录,c#,entity-framework,C#,Entity Framework,我有一个实体框架上下文,其中有一个名为“LengthDatas”的对象和一个名为“AbsoluteCounter”的属性/列,它是一个字符串值。字符串值表示十进制数。我想使用lambda表达式来查找最大的表达式。如何修改表达式以实现此目的 context.LengthDatas.Where(c=>c.AbsoluteCounter.Last()) (我知道该列应为十进制,我将在以后将其转换为十进制值) 谢谢使用降序和第一(或默认)组合: context.LengthDatas.OrderByDe

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

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

(我知道该列应为十进制,我将在以后将其转换为十进制值)


谢谢

使用降序
第一(或默认)
组合:

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

但要真正获得十进制比较(而不是字符串),您必须定义自己的方法,如问题答案中所述。

使用
OrderByDescending
First(OrDefault)
组合:

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

但要真正获得十进制比较(而不是字符串),您必须定义自己的方法,如问题答案中所述。

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

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

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

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

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

如果absolutecounter为十进制,则查询将对其进行排序,第一个元素将是最大的

如果数据格式不正确(前导空格、字母),则按字符串排序可能会失败。如果您能负担得起将数据放入内存的费用,这将消除漏洞:

        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引用技术

我在一个代码优先的应用程序中进行测试,但通过向项目中添加ADO.Net实体数据模型,添加了一个EDMX。有几件事需要整理,但基本上以下类型的查询可以工作

var result = db.LengthDatas.Max(c => EdmxExtensions.DecimalParse(c.AbsoluteCounter));
LINQTO实体生成的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时那样是一个健壮的转换。它将引发字符串格式错误的异常。

如果数据格式错误(前导空格、字母),则按字符串排序可能会失败。如果您能负担得起将数据放入内存的费用,这将消除漏洞:

        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引用技术

我在一个代码优先的应用程序中进行测试,但通过向项目中添加ADO.Net实体数据模型,添加了一个EDMX。有几件事需要整理,但基本上以下类型的查询可以工作

var result = db.LengthDatas.Max(c => EdmxExtensions.DecimalParse(c.AbsoluteCounter));
LINQTO实体生成的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时那样是一个健壮的转换。它将抛出格式错误字符串的异常。

首先完成十进制转换非常重要。排序字符串不能确保最大的数字(甚至字符串)将是第一个。您是如何获得Decimal.Parse(c.AbsoluteCounter)以使用Linq to Entities的?我收到此错误消息:Linq to Entities无法识别方法“System.Decimal Parse(System.string)”的,这个方法不能被转换成商店的表达方式。看看答案:很好,我会试试看。你应该在上面的答案中引用它。重要的是先把它转换成十进制。排序字符串不能确保最大的数字(甚至字符串)将是第一个。您是如何获得Decimal.Parse(c.AbsoluteCounter)以使用Linq to Entities的?我收到此错误消息:Linq to Entities无法识别方法“System.Decimal Parse(System.string)”的,这个方法不能被转换成商店的表达方式。看看答案:很好,我会试试看。你应该在上面的答案中引用它。