在实体框架中使用子查询 [英] Using subquery in entity framework

查看:73
本文介绍了在实体框架中使用子查询的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试编写实体框架linq查询以生成以下SQL.但是我不确定如何在实体框架中使用子查询.

I am trying to write the entity framework linq query to generate the following SQL. But I am not sure how to use subqueries with entity framework.

我要生成的Sql是:

Declare @StartDate Datetime2; Set @Startdate = '2014-Feb-16 09:52'
Declare @EndDate Datetime2; Set @Enddate = '2014-Feb-18 09:52'

 SELECT
         [D].[RefId]
        ,[D].[StatusId]
        ,[D].[StatusDate]
        ,[D].[Reference]
        ,[RSC].[Event] 
        ,[RSC].[Information] 
        ,[RSC].[CreatedDate] 
  FROM (
    SELECT
           [R].[RefId]
          ,[R].[StatusId]
          ,[R].[StatusDate]
          ,[I].[Reference]          
          ,(SELECT TOP 1
                   [RSC].[ChangeId]
            FROM
                   [dbo].[StateChangeTable] AS [RSC] (nolock)
            WHERE
                   [RSC].[RefId] = [R].[RefId]
            ORDER BY
                   [RSC].[ChangeId] DESC) AS [LastChangeId]
    FROM
           [dbo].[Table1] AS [R] (nolock)
    INNER JOIN
           [dbo].[Table2] AS [I] (nolock)
    ON
           [R].[RefId] = [I].[RefId]

    WHERE
           [R].[StatusId] IN (4, 6)
    AND    [R].[StatusDate] between @StartDate and @EndDate
    ) AS [D]
  INNER JOIN
         [dbo].[StateChangeTable] AS [RSC] (nolock)
  ON
         [D].[LastChangeId] = [RSC].[ChangeId

]

我到目前为止编写的代码是:

And the code I wrote till now is:

return this.DbContext.Table1
            .Join(this.DbContext.Table2, rc => rc.RefId, ri => ri.RefId, (rc, ri) => new { rc, ri })                     
            .Join(this.DbContext.StateChangeTable, request => request.ri.RefId,  rsc => rsc.RefId, (request, rsc) => new {request, rsc})
           .Where(r => (r.rsc.ChangeId == ((from rsc in this.DbContext.StateChangeTable                                                               
                                                orderby rsc.ChangeId descending
                                                select rsc.ChangeId).FirstOrDefault())) &&
                        (r.request.rc.StatusId == 4 || r.request.rc.StatusId == 6) &&
                        (r.request.rc.StatusDate >= startDateTime && r.request.rc.StatusDate <= endDateTime))              
            .Select(requestDetails => new StatusDetail
                {
                    RefId = requestDetails.request.rc.RefId,
                    StatusDate = requestDetails.request.rc.StatusDate,
                    StatusId = requestDetails.request.rc.StatusId,
                    Reference = requestDetails.request.ri.DistributionReference.Value,
                    Event = requestDetails.rsc.Event,
                    CreatedDate = requestDetails.rsc.CreatedDate,
                    Information = requestDetails.rsc.Information
                }).ToList();

能不能让我知道我做错了什么?

Can some please let me know what I am doing wrong?

非常感谢

推荐答案

以下是完整查询

var query = (from D in
                 ((from tab1 in DbContext.Table1
                   join tab2 in DbContext.Table2 on tab1.RefId equals tab2.RefId
                   where (tab1.StatusId == 4 || tab1.StatusId == 6)
                          && (tab1.StatusDate >= startDate && tab1.StatusDate <= endDate)
                   select new
                   {
                       RefId = tab1.RefId,
                       StatusId = tab1.StatusId,
                       StatusDate = tab1.StatusDate,
                       Reference = tab2.Reference,
                       LastChangeId = (from RSC in DbContext.StateChangeTable
                                       where RSC.RefId == tab1.RefId
                                       orderby RSC.ChangeId descending
                                       select RSC.ChangeId).FirstOrDefault()
                   }))
             join RSC in DbContext.StateChangeTable on D.LastChangeId equals RSC.ChangeId
             select new StatusDetail
             {
                 RefId = D.RefId,
                 StatusId = D.StatusId,
                 StatusDate = D.StatusDate,
                 Reference = D.Reference,
                 Event = RSC.Event,
                 Information = RSC.Information,
                 CreatedDate = RSC.CreatedDate
             }).ToList();

这篇关于在实体框架中使用子查询的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆