在我的应用程序上下文中形成linq子查询时遇到问题

时间:2017-05-09 22:34:18

标签: c# sql sql-server linq

以下是我尝试转换为Linq

的SQL示例
SELECT 
*  FROM assetassignment 
              WHERE asgn_type = 'trc' AND asgn_id = '54490' AND lgh_number <> 3015097 AND mov_number <>2030782
                     and asgn_enddate in (select max(asgn_enddate) FROM assetassignment 
                        WHERE asgn_type = 'trc' AND asgn_id = '54490' AND lgh_number <> 3015097 AND mov_number <> 2030782 and asgn_enddate <= '03/19/2017')

我需要将其转换为Linq。我使用的存储库如下:

public async task<AssetAssignment> FindPreviousTrip(string tractorNumber, DateTime endDate, int legNumber,string moveNumber)
    {
        using (var ctx = new AssetAssignmentContext(_nameOrConnectionString))
        {
            var previousTrip = from a in ctx.Set<AssetAssignment>()
                                    where a.AssignmentType == "TRC" &&
                                    a.AssignmentId == tractorNumber &&
                                    a.LegId == legNumber &&
                                    a.MoveNumber == moveNumber &&
                                    a.EndDate).in()



        }
    }

正如您所看到的那样,我正在努力,但是在语句中继续使用EndDate的子查询失败。

我会继续关注它,但感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

var previousTrip = from a in ctx.Set<AssetAssignment>()
      where a.AssignmentType == "TRC" &&
            a.AssignmentId == tractorNumber &&
            a.LegId != legNumber &&
            a.MoveNumber != moveNumber &&
            a.EndDate == (from b in ctx.Set<AssetAssignment>()
                          where b.AssignmentType == "TRC" && b.AssignmentId == tractorNumber && b.LegId != legNumber && b.MoveNumber != moveNumber && b.EndDate <= new DateTime(2017, 19, 3)
                          select b.EndDate).Max()
        select a;

您可能想要为常见查询创建变量

var baseTrip = from a in ctx.Set<AssetAssignment>()
           where a.AssignmentType == "TRC" &&
                 a.AssignmentId == tractorNumber &&
                 a.LegId != legNumber &&
                 a.MoveNumber != moveNumber
           select a;

var previousTrip = from a in baseTrip
               where a.EndDate == (from b in baseTrip where b.EndDate <= new DateTime(2017, 19, 3) select b.EndDate).Max()
               select a;