【问题标题】:How to use method-based queries with lambda expressions如何在 lambda 表达式中使用基于方法的查询
【发布时间】:2017-10-10 17:49:02
【问题描述】:

我想用 lambda 表达式连接两个表:Order 和 OrderLogistics。

顺序如下:

public class Order{
    public int ID { get; set; }
}

OrderLogistics 看起来像这样:

public class OrderLogistics{
    public int ID { get; set; }
    public int OrderID { get; set; }
}

我想通过 Order.ID 和 OrderLogistics.OrderID 加入他们。

我不明白如何使用此问题中的查询。 Lambda Expression for join

我知道的唯一写查询的方法是:

IQueryable<Order> listOfRecentOrders = Orders
    .Where(x => x.OrderLogistics.DepartureDate == date
    && x.TypeID != 4
    && x.TypeID != 5
    && x.StatusID != 8
    && x.StatusID != 9
    && x.StatusID != 10
    && x.Customer.ID != null
    && x.IsDeleted == false
    && x.OrderLogistics.DepartureTime >= 100
    && x.OrderLogistics.DepartureTime <= 2400)
    .OrderBy(x => x.OrderLogistics.DepartureTime)
    .Take(8));

我不明白他们在用“var 查询”做什么。我如何在 MVC 中使用它? 上述方法在我的存储库中,结果将传递给控制器​​。

所以我想要的是一个可以使用 Order 属性和 OrderLogistics 属性的查询。我自己上面的查询不起作用,因为关系“x.OrderLogistics”不存在。

编辑: 我有:

IQueryable<Order> listOfRecentOrders = 

还有:

var joined2 = from p in Order
    join pType in OrderLogistics
    on p.ID equals pType.OrderID
    select (x => x.Order);

如何将joined2 分配给listOfRecentOrders?我在所有查询问题中都没有看到这个。这是最重要的部分。

问题: 我需要在连接两个表的地方进行查询。我想把它放在一个列表中并将这个列表传递给控制器​​,以便我可以在我的视图中使用数据。

【问题讨论】:

  • 只需将People替换为Order,将PeopleTypes替换为OrderLogistics,将PersonType替换为ID,将TypeID替换为OrderID...最后添加@ 987654336@ 在Take(8) 之前。
  • 我正在尝试这个 Haukinger。但它不是重复的。我也在问如何在 MVC 中实现这个我有点得到查询但是我如何使用joined或joined2?
  • How do I assign joined2 to listOfRecentOrders? - 如果类型匹配或根本不匹配(如果它们不匹配),则使用 =。加入后,您有一个IEnumerable&lt;some-anonymous-type&gt;,并通过选择从中提取订单,因此您将获得一个IEnumerable&lt;Order&gt;。究竟是什么问题?
  • 查询数据库并不是真正的 MVC 特定的,请不要将多个主题混在一起。如果您提出要解决的特定(和简短)问题,而不是在没有明确解释您的目标的情况下编写一些问题代码,这也会有所帮助。 (实际上,我认为您有一些具体问题,但需要突出显示,以便每个人都可以将您的问题与您的解决方案尝试区分开来)

标签: c# linq lambda


【解决方案1】:
IQueryable<Order> listOfRecentOrders = from p in Order
                                       join pType in OrderLogistics on p.ID equals pType.OrderID
                                       select p.Order;

请注意,鉴于您要返回的内容,我更喜欢这个:

IQueryable<Order> listOfRecentOrders = from p in Order
                                       where OrderLogistics.Select(ol => ol.OrderID).Contains(p.ID)
                                       select p.Order;

使用 Contains 的第二个查询转换为 SQL EXISTS 并自动删除重复项。如果您想要重复项,请使用第一个查询。

【讨论】:

    【解决方案2】:

    我自己制定了解决方案。感谢所有的投入! 而不是像 NetMage 告诉我的那样使用选择,而是将其放入模型中。

    为什么?我想让我的控制器尽可能小,所以我在存储库中进行的所有查询。然后我将它传回给控制器。控制器和/或视图确实需要一个能够读取 IQueryable 的模型。如果没有模型,它将是匿名类型。

    public IQueryable<OrderOrderLogisticsModel> getOrdersOfOneDate(long date)
    {
        IQueryable<OrderOrderLogisticsModel> recentOrders = Orders.Join(OrderLogisticss,
            order => order.ID,
            orderlogistics => orderlogistics.OrderID,
            (order, orderlogistics) => new OrderOrderLogisticsModel { Order = order, OrderLogistics = orderlogistics })
    
            .Where(x => x.OrderLogistics.DepartureDate == date
            && x.OrderLogistics.DepartureTime >= 100
            && x.OrderLogistics.DepartureTime <= 2400
            && x.Order.TypeID != 4
            && x.Order.TypeID != 5
            && x.Order.StatusID != 8
            && x.Order.StatusID != 9
            && x.Order.StatusID != 10
            && x.Order.IsDeleted == false
            && x.Order.Customer.ID != null
            && x.Order.NumberOfCarts > 0)
            .Take(8);
    
        return recentOrders;
    }
    

    型号:

    public class OrderOrderLogisticsModel
    {
        private Order order;
    
        public Order Order
        {
            get { return order; }
            set { order = value; }
        }
    
        private OrderLogistics orderLogistics;
    
        public OrderLogistics OrderLogistics
        {
            get { return orderLogistics; }
            set { orderLogistics = value; }
        }
    }
    

    我喜欢 lambda,但如果您对我的查询有其他提示,我想听听。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-03
      • 2017-07-31
      • 1970-01-01
      • 1970-01-01
      • 2017-03-02
      相关资源
      最近更新 更多