如何使用LINQ从表中获取最新条目?

时间:2014-02-04 15:07:12

标签: c# sql linq

我有一张价格表,其中有一个Date Updated列。每当价格发生变化时,表格都会有新的条目。

为了返回最新的价格,我尝试按日期排序,然后使用.Last()获取最新的条目:

 var upgrades = from d in vf.tl_phn_devices
                       where d.available == true
                       select new
                       {
                           DeviceName = d.tl_phn_manufacturer.manufacturer + " " + d.model,
                           Price = (from p in vf.tl_phn_prices 
                                    where p.deviceID == d.deviceID
                                    orderby p.dateUpdated ascending
                                    select p.price).Last(),
                           URL = d.url,
                           ImageURL = d.image

                       };

然而,当我运行上面的内容时,我得到一个错误,说明.Last()不受支持。 我也试过.AsEnumberable()。Last()但是这也不起作用。

在代码的其他地方,我采取了额外措施来解决类似的问题:

  var orders = (from o in vf.tl_phn_orders
                    where o.login == CurrentUserName
                    orderby o.date ascending
                    select new
                     {
                         Login = o.login,
                         Name = o.name,
                         Device = o.tl_phn_device.tl_phn_manufacturer.manufacturer + " " + o.tl_phn_device.model,
                         Price = o.tl_phn_price.price,
                         date = o.date

                     }).AsEnumerable();

        var order = orders.LastOrDefault();

但是我想在一个“点击”中完成所有操作,所以我可以在第一个查询中返回它。

2 个答案:

答案 0 :(得分:6)

选择orderby descending,然后选择First

LastLastOrDefaultnot supported的实体框架,因为它们无法转换为基础语言(针对您​​的情况使用SQL)

orderby p.dateUpdated descending
select p.price).First(),

您可能还会看到:Supported and Unsupported LINQ Methods (LINQ to Entities)

答案 1 :(得分:2)

使用First()并更改顺序:

 var upgrades = from d in vf.tl_phn_devices
                where d.available
                select new
                {
                    DeviceName = d.tl_phn_manufacturer.manufacturer + " " + d.model,
                    Price = (from p in vf.tl_phn_prices 
                             where p.deviceID == d.deviceID
                             orderby p.dateUpdated descending
                             select p.price).First(),
                    URL = d.url,
                    ImageURL = d.image    
                };

问题是EntityFramework无法为您的查询生成SQL。

您的第二个查询使用.Last()是有效的,因为您已将实体加载到内存中(使用.AsEnumerable())并且现在使用LINQ to Objects而不是LINQ to Entities。

由于嵌套查询,您无法对第一个查询执行相同的操作。