C# 基于max的实体框架查询
有人让我将T-SQL语句转换为LINQ to EF查询:C# 基于max的实体框架查询,c#,linq,entity-framework,C#,Linq,Entity Framework,有人让我将T-SQL语句转换为LINQ to EF查询: SELECT * FROM CopperPrices where ID in (select max(ID) as ID from copperprices group by market, pname) 我使用常见的LINQ-TO-OBJECT思想,并给出以下答案: class CopperPrice { public int ID { get; set; } public string Market {
SELECT * FROM CopperPrices
where ID in
(select max(ID) as ID from copperprices group by market, pname)
我使用常见的LINQ-TO-OBJECT思想,并给出以下答案:
class CopperPrice
{
public int ID { get; set; }
public string Market { get; set; }
public string PName { get; set; }
}
var result = from p in copperPrices
group p by new { Market = p.Market, PName = p.PName } into g
select g.OrderByDescending(p => p.ID).First();
但由于以下例外情况,它在EF中不起作用:
方法“First”只能用作最终查询操作。
考虑在这个实例中使用方法“FrestRealDebug”代替
能否将上述T-SQL语句转换为一个LINQ查询语句?给您:
var result1 = copperPrices.GroupBy(g => new { g.Market, g.PName }).Select
(
x => x.ToList().OrderByDescending(z => z.ID).FirstOrDefault()
);
这里的重要部分是.Select(x=>x.ToList())。ToList返回一个iGroup的值,每个值都是您最终想要排序和选择的最大值。My linq语句显然可以返回一些项。如果两个查询都可以运行,它们都返回一个值。@hvd它们运行并返回相同的结果。如果为True,则返回一个值,但该值是一个“分组”,可以在上下枚举。分组中的所有“铜币”都具有最大ID。@hvd你说得对。我把自己弄糊涂了……但我相信我现在找到了正确的解决办法!:)我更新了答案。老实说,所有的编辑看起来更像是一个猜谜游戏,而不是答案。我怀疑linqto实体是否会接受投影内部的
ToList()
。你测试过吗?当你按照错误信息的提示去做时会发生什么<如果你知道你有一个非空集合,那么code>FirstOrDefault应该给出与First
相同的结果,因此如果EF接受FirstOrDefault
,而First
不接受,那么使用FirstOrDefault
。