我想用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?在所有查询问题中我都没有看到这个任何地方。这是最重要的部分。
问题: 我需要在一个查询中加入两个表。我希望将其放入列表并将此列表传递给控制器,以便我可以在视图中使用该数据。
答案 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,但如果您对我的查询有其他提示,我希望听到它们。