繁体   English   中英

需要将左连接 SQL 转换为 linq 查询 - 帮助表示赞赏

[英]Need to convert Left join SQL to linq query - help appreciated

这是我的代码,我遇到的问题是 On 子句中的小于比较......因为 Linq 不允许这样做......当我将其中一个字段与 null 进行比较时,向下迁移到 where 子句将不起作用。

这是 sql 查询(现在 a.UserID= 是硬编码的)

SELECT A.Policy, A.Comments, A.EventDTTM, A.Status, A.Reason, A.FollowUp
                FROM PP_PolicyActivity A
                LEFT JOIN PP_PolicyActivity B
                ON(A.Policy = B.Policy AND A.EventDTTM < B.EventDTTM)
                WHERE A.UserID = 'Ixxxxxx' 
                AND B.EventDTTM IS NULL AND a.status = 'open - Pending'
                order by A.EventDTTM DESC

我需要上述查询的结果集作为 IEnumerable 列表来填充视图

我的任务是重建一个旧的 VB ASP NET,它背后有一组常设生产数据库......我没有更改数据库设计的选项。 我连接到服务器和数据库,这个查询是针对该数据库上的一个表......该模型还反映了实际表的布局。

问题在于 A.EventDTTM < B.EventDTTM - 我无法将其移至 where 子句,因为我还必须在 where 子句中处理 B.EventDTTM IS NULL。 我需要以某种方式重新调整查询,以便它对 'linq' 友好

 public class PolicyActivityModel
    {
        public string Policy { get; set; }
        public int PolicyID { get; set; }

        public string Status { get; set; }

        public string Reason { get; set; }

        public string Comments { get; set; }

        public DateTime EventDTTM { get; set; }

        public string UserID { get; set; }

        public DateTime FollowUp { get; set; }
    }

公司政策禁止我显示连接字符串。

我对 Linq 非常陌生,非常感谢任何帮助

谢谢你

从数据库中获取策略后,您可以使用导航属性。

var policy = DbContext.First(x => x.Id == 1000);
var otherPolicies = policy.ConnectedPolicies.Where(p => ...);

自连接很奇怪,但这是对 Linq 最直接的翻译:

var query = from leftPP in PP_PolicyActivity 
     join rightPP in PP_PolicyActivity
          on new { Policy = leftPP.Policy, EventDTTM = leftPP.EventDTTM } 
          equals new { Policy = rightPP.Policy, EventDTTM = rightPP.EventDTTM }
          into pp from joinedRecords.DefaultIfEmpty()
where leftPP.UserId == 1 
      && leftPP.EventDTTM < rightPP.DTTM)
      && rightPP.EventDTTM == null 
      && leftPP.status = "open - Pending"
select new
{
    leftPP,
    rightPP
}

我免费输入了这个,没有模型或智能感知,因此可能会有一些较小的错误。

您可以在该子句中添加 order by,但它仍然是 IQeryable,所以我会保留它。

然后,获取模型列表:

var results = query.OrderByDescending(x => x.EventDTTM).ToList();

实际的连接是第 2、3、4 和 5 行。它是 SQL 的冗长和“倒退”,最重要的是使用匿名类型。 访问单个属性将类似于:

 results[0].leftPP.PolicyId

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM