将 sql 查询转换为 linq 查询

Posted

技术标签:

【中文标题】将 sql 查询转换为 linq 查询【英文标题】:convert sql queries to linq queries 【发布时间】:2012-11-21 09:39:38 【问题描述】:

我对 LINQ 很陌生,我做了很多将 SQL 查询转换为 LINQ 的尝试都失败了。请帮我解决一些问题。确切的 LINQ 是什么 .. 提前致谢。

// 只是整个查询的一部分

  select distinct p.IdPatient,p.IdDoc
  from patd p (NOLOCK)
     left outer join StatusChange sc (NOLOCK)
        on sc.IdPatient = p.IdPatient
           and sc.IdClinicNumber = 23430 
           and sc.IdStatus = 'A'
           and sc.DateStatusChange > GetDate()
     join TrtTyp t ON p.IdTreatmentType = t.IdTreatmentType 
           and t.TypeModality IN ('H','P')
  Where 
      p.IdType IN ('P','E','M')
      and (IsNull(p.IsInactive,0) in (1,0) or sc.IdStatusChange is not null)
      and Not Exists(
         Select 1
         From   Expire e (NOLOCK)
         Where  e.IdPatient = p.IdPatient
      )
      and p.IdClinicNumber = 23430

【问题讨论】:

对于大查询,创建存储过程或在 EF 中查看和解决它通常是更好的选择。尤其是当 NOLOCK 这样的特定语法至关重要时,你甚至不能使用 linq。 【参考方案1】:

首先你们都需要以更规范的形式重写查询,实际上不需要连接

select distinct
    p.IdPatient, p.IdDoc
from patd as p
where 
    p.IdClinicNumber = 23430 and
    p.IdType in ('P','E','M') and
    p.IdTreatmentType in
    (
         select tt.IdTreatmentType
         from TrtTyp as tt
         where tt.TypeModality in ('H','P')
    ) and
    (
        isnull(p.IsInactive, 0) in (1,0) or
        p.IdPatient in 
        (
            select sc.IdPatient
            from StatusChange as sc
            where
                sc.IdClinicNumber = p.IdClinicNumber and
                sc.IdStatus = 'A' and
                sc.DateStatusChange > GetDate()
        )
    ) and
    p.IdPatient not in
    (
        select e.IdPatient
        from expire as e
    )

现在您可以编写您的 LINQ。请记住,我没有你的数据来测试它

var query = 
from p in patds
where
    p.IdClinicNumber == 23430 &&
    (new char[]  'P', 'E', 'M' ).Contains(p.IdType) &&
    (
        from t in TrtTyps
        where (new char[]  'H','P' ).Contains(t.TypeModality)
        select t.IdTreatmentType
    ).Contains(p.IdTreatmentType) &&
    (
        (new int[]  1, 0 ).Contains(p.IsInactive ?? 0) ||
        (
            from sc in StatusChanges
            where
                sc.IdClinicNumber == p.IdClinicNumber &&
                sc.IdStatus == 'A' &&
                sc.DateStatusChange > DateTime.Now
            select sc.IdPatient
        ).Contains(p.IdPatient)
    ) &&
    !(
        from e in Expires
        select e.IdPatient
    ).Contains(p.IdPatient)
select new p.IdPatient, p.IdDoc;

【讨论】:

非常感谢 Roman,以后会按照 Ur 的说明进行操作,并且给出的查询符合要求,除了我能够管理的少量修改。问候..

以上是关于将 sql 查询转换为 linq 查询的主要内容,如果未能解决你的问题,请参考以下文章

如何将 linq 查询转换为 SQL 查询?

将 SQL 子查询转换为 Linq 查询

协助将 SQL 查询转换为 LINQ 查询

如何将sql查询转换为linq查询

将 SQL 原始查询转换为 Linq

将 SQL 转换为 LINQ 查询