【问题标题】:Entity Framework query with ToList().Last() in Where()在 Where() 中使用 ToList().Last() 进行实体框架查询
【发布时间】:2018-08-31 16:20:18
【问题描述】:

我必须从OrderStatus 的最后一个是Registered 的数据库中获取记录。这就是我尝试查找这些记录的方式

    List<Order> orders = db.Orders
        .Include("OrderStatuses")
        .Where(x => x.OrderStatuses.ToList().Last().Status == StatusOrder.Registered)
        .ToList();

但我得到异常

LINQ to Entities 无法识别该方法 'Lomax.Models.OrderStatus 最后订单状态' 方法,并且该方法不能翻译成商店表达式。

有什么办法不首先从 db 中获取所有 Orders,然后再寻找最后一个 OrderStatus 是我想要的吗?还是没关系(速度)?

订单类:

public class Order
    {
        [Key]
        public int ID { get; set; } 
        (...)
        public virtual ICollection<OrderStatus> OrderStatuses { get; set; }
    }

OrderStatus 类:

public class OrderStatus
    {
        [Key]
        public int ID { get; set; }
        public DateTime Date { get; set; }
        public Enumerates.StatusOrder Status { get; set; }

        [ForeignKey("Order")]
        public int OrderID { get; set; }
        public virtual Order Order { get; set; }
    }

【问题讨论】:

  • 不要打电话给ToList()无处不在。只在需要的地方调用它——它分配内存:每次都消耗内存和更多的 CPU。
  • 我不知道你的数据结构,但你可以通过从订单状态表开始来简化这一点,例如 db.OrderStatuses.Where(x => x.Status == StatusOrder.Registered).Select (x => x.Order)
  • @johnny5 它需要所有Orders,其中StatusOrder 中的任何一个都是Registered。在Registered 之后可以有Cancelled 状态或任何其他我不想接受的状态。

标签: c# sql entity-framework linq


【解决方案1】:

Linq to entity 不支持 .Last()。 你可以使用 orderby() 和 take() 来代替

 List<Order> orders = db.Orders
        .Include("OrderStatuses")
        .Where(x => x.OrderStatuses.OrderByDescending(q => q.YourCol).First().Status == StatusOrder.Registered)
        .ToList();

【讨论】:

  • 如何确定哪个 OrderStatus 是“最后一个”?
  • 我认为默认情况下主键或第一列是 order by,order。您可以通过删除 ToList() 来检查查询以查看哪一列位于第一列。
  • @ArashGhasemiRad,除非指定,否则任何 SQL 都没有默认顺序
  • @DavidBrowne-Microsoft 添加时间。
  • @ArashGhasemiRad 我认为这是正确的,按日期排序并检查第一个状态是否是我想要的给我正确订单的列表。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-19
  • 2011-06-29
  • 2016-08-03
  • 1970-01-01
  • 2012-07-31
  • 1970-01-01
  • 2022-01-06
相关资源
最近更新 更多