具有多个连接和多个条件的Linq查询

时间:2016-01-07 15:41:00

标签: linq join telerik

我正在使用Telerik Data Access执行OR映射。

我正在尝试使用Linq执行连接查询,但不确定如何正确执行。

原始的 sql 查询由:

提供
'SELECT O.OPS_LEG_ID, O.ATD_DATE, O.DEP_AIRPORT_ACT, O.ARR_AIRPORT_ACT, O.ATA_DATE,  '+
                          'O.FL_LOG_ATD_DATE, O.FL_LOG_ATA_DATE, O.FL_LOG_DEP_AIRPORT, O.FL_LOG_ARR_AIRPORT, '+
                          'O.FL_NB, O.DESIGNATOR, O.FL_LOG_ID, O.FL_LOG_STATUS '+
                          'FROM CREW_ROT_ROLE CR, OPS_LEG O, CREW_ROLES R, CREW_PAIRING_CMP CP '+
                          'WHERE CR.ROLE_CDE = R.ROLE_CDE '+
                            'AND CR.CREW_ROTATION_ID = CP.CREW_ROTATION_ID '+
                            'AND CP.OPS_LEG_ID = O.OPS_LEG_ID '+
                            'AND CR.CREW_CDE = :CREW_CDE '+
                            'AND O.ATD_DATE >= :D_FROM '+
                            'AND O.ATD_DATE <= :D_TO '+
                            //'AND R.ROLE_TYPE = 0 '+
                          'ORDER BY O.ATD_DATE

已从SQL表生成相应的实体。我现在正在尝试构建等效的Linq查询,这似乎不起作用:

var results = from opsLeg in dbContext.OPS_LEGs
                              from crewRotationRole in dbContext.CREW_ROT_ROLEs
                              from crewRole in dbContext.CREW_ROLEs
                              from crewPairingComponent in dbContext.CREW_PAIRING_CMPs
                              where crewRotationRole.ROLE_CDE == crewRole.ROLE_CDE
                              && crewRotationRole.CREW_ROTATION_ID == crewPairingComponent.CREW_ROTATION_ID
                              && crewPairingComponent.OPS_LEG_ID == opsLeg.OPS_LEG_ID
                              && crewRotationRole.CREW_CDE == userId
                              select new { OpsLegId = opsLeg.OPS_LEG_ID,
                                           Designator = opsLeg.DESIGNATOR,
                                           FlightNumber = opsLeg.FL_NB
                                         };

尝试上一个查询,引发异常:

  

&#34;标识符&#39; ROLE_CDE&#39;不是参数或变量或字段   &#39; FlightLogEntities.OPS_LEG&#39 ;.如果&#39; ROLE_CDE&#39;是一个属性,请添加   FieldAlias或Storage属性或将其声明为字段   。别名&#34;

不确定如何继续。使用Linq连接的正确查询是什么?谢谢!

2 个答案:

答案 0 :(得分:0)

如果您正在使用类似于Entity框架的ORM,那么概念模型将是类的混合,这将提供以对象为中心的数据视图。

因此,您将使用Linq on Objects,在这种情况下,您不需要像在SQL中为数据库那样编写连接查询。概念模型将包含使用导航属性具有关系的对象,并且要访问导航属性,您可以将其作为对象的属性进行访问。

例如,如果数据库中有2个表,则客户&amp;命令。以下SQL语句将返回客户编号1的所有订单:

SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
INNER JOIN Orders
ON Customers.CustomerID=Orders.CustomerID
Where Customers.CustomerID = 1 

如果我们使用EF生成从Database生成概念模型,我们将获得Customer和Order的类,而Customer类将具有ICollection的属性。因此,如果您需要与上述SQL查询相同的结果,则可以按照以下方式执行此操作

var CustomerOne = context.Customers.Where(x => x.CustomerID == 1);
var ordersForCustomerOne = CustomerOne.Orders;

答案 1 :(得分:0)

您可以尝试类似

的内容
var k = from r in dataContext.Order_Details
        join t in dataContext.Orders on r.OrderID equals t.OrderID
        select r.OrderID   ;