在Linq和EF中为连接表创建条件WHERE子句

时间:2016-07-30 14:10:49

标签: c# sql-server entity-framework linq

要求:

此时显示订单的当前状态。这将返回尚未发货的所有订单以及今天发货的订单。

数据结构:

OrderHeader (1) -> (many) ShippingContainerHeaders

以下代码的副本。它最初与oh.CreatedOn部分一起使用,现在已被注释掉了。但是要求变得精细,而是需要使用已连接表ShippingContainerHeader.ShipDateTimeUTC的特定发货日期来考虑那些已发货。如果该订单的任何一个船舶集装箱具有ShipDateTimeUTC今天,则包括它。但是我在下面的内容不会编译并给出这个错误:

Error 17 Type of conditional expression cannot be determined because there is no implicit conversion between 'System.Collections.Generic.IEnumerable<OTIS.Domain.InventoryMgmt.ShippingContainerHeader>' and 'bool'

return orderHeaderRepository
    .SearchFor(oh =>
        oh.FacilityId == intFacilityId
        && oh.OrderType == OrderHeader.OrderTypes.ShipOrder.ToString()
        && (
            oh.StatusId >= (int)OrderHeader.Statuses.Shipped && oh.ShippingContainerHeaders != null
            ? oh.ShippingContainerHeaders.Where(sh => sh.ShipDateTimeUTC >= startDateTime) //(oh.CreatedOn >= startDateTime) && (oh.CreatedOn <= endDateTime)
            : oh.Id > 0
            )
        )

更新

如果我将.Where更改为.Any,我会收到此错误:

Cannot compare elements of type 'System.Collections.Generic.ICollection`1[[OTIS.Domain.InventoryMgmt.ShippingContainerHeader, OTIS.Domain, Version=1.5.6054.27019, Culture=neutral, PublicKeyToken=null]]'. Only primitive types, enumeration types and entity types are supported.

我的解决方案

虽然接受的答案是具体的,因为没有办法实现我想要实现的目标,但它没有提供替代解决方案。最后,我不得不创建一个UNION查询,首先查询尚未发货的所有订单,另一个发货的订单,并对两个查询执行联合。

1 个答案:

答案 0 :(得分:0)

oh.ShippingContainerHeaders != null
            ? oh.ShippingContainerHeaders.Where(sh => sh.ShipDateTimeUTC >= startDateTime) //(oh.CreatedOn >= startDateTime) && (oh.CreatedOn <= endDateTime)
            : oh.Id > 0

此声明不正确:

oh.ShippingContainerHeaders .Where(sh => sh.ShipDateTimeUTC >= startDateTime) =IEnumerable<ShippingContainerHeader>()

oh.Id > 0是bool!

阅读here原因!

  

无法确定条件表达式的类型,因为&#39; class1&#39;之间没有隐式转换。和&#39; class2&#39;   当您希望不同类的对象使用相同的代码时,类之间的转换很有用。但是,两个一起工作的类不能进行相互和冗余的转换,也不能进行隐式转换。 class1和class2的类型是独立确定的,并且选择更通用的类型作为条件表达式的类型。有关如何确定类型的更多信息,请参阅无条件运算符无法隐式转换。   要解析CS0173,请验证class1和class2之间是否存在唯一的隐式转换,无论转换的方向如何,也不管转换所在的类是什么。有关更多信息,请参阅隐式数字转换表(C#参考)和转换运算符(C#编程指南)。