如何使用基于方法的查询与lambda表达式

时间:2017-10-09 10:06:48

标签: c# linq lambda

我想用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 query'得到他们正在做的事情。我如何在MVC中使用它? 上面的方法在我的存储库中,结果将传递给控制器​​。

所以我想要的是一个查询,我可以使用OrderLogistics的Order AND属性的属性。我上面的查询不起作用,因为“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?在所有查询问题中我都没有看到这个任何地方。这是最重要的部分。

问题: 我需要在一个查询中加入两个表。我希望将其放入列表并将此列表传递给控制器​​,以便我可以在视图中使用该数据。

2 个答案:

答案 0 :(得分: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并自动删除重复项。如果您想要重复项,请使用第一个查询。

答案 1 :(得分:0)

我自己制定了解决方案。感谢所有的投入! 而不是使用像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,但如果您对我的查询有其他提示,我希望听到它们。