【发布时间】:2019-07-11 10:59:23
【问题描述】:
如何将此查询转换为 Linq 或 Lambda 表达式?
SELECT SURECTNM.RolId,
IZIN_LIST.*
FROM (
SELECT DISTINCT Damga, SurecId FROM WEB_KULLANICISUREC
) IZIN_SUREC
LEFT JOIN WEB_SURECROL SURECTNM
ON IZIN_SUREC.SurecId = SURECTNM.SurecID
LEFT JOIN WEB_KULLANICISUREC AS IZIN_LIST
ON IZIN_SUREC.Damga = IZIN_LIST.Damga and SURECTNM.RolId = IZIN_LIST.RolId
WHERE IZIN_SUREC.Damga = '9EE15E44-C7B3-4AD5-A73F-3A2B4B49C0CC'
我使用的是数据库优先。
WEB_KULLANICISUREC 一个实体类,
WEB_KULLANICISUREC 和 WEB_ROLSUREC 的关系由 SurecID 提供。
public partial class WEB_KULLANICISUREC
{
public int KullaniciSurecId { get; set; }
public Nullable<System.Guid> Damga { get; set; }
public Nullable<int> SurecId { get; set; }
public Nullable<int> RolId { get; set; }
public Nullable<bool> OnayDurumu { get; set; }
public Nullable<bool> SurecComplate { get; set; }
public Nullable<bool> SurecAktif { get; set; }
public Nullable<bool> RedDurumu { get; set; }
public string Aciklama { get; set; }
public Nullable<System.DateTime> Tarih { get; set; }
public Nullable<int> IDonaypersonel { get; set; }
public virtual WEB_ROL WEB_ROL { get; set; }
public virtual WEB_KULLANICI WEB_KULLANICI { get; set; }
public virtual WEB_SURECTANIM WEB_SURECTANIM { get; set; }
}
public partial class WEB_SURECROL
{
public int SurecRolID { get; set; }
public Nullable<int> SurecID { get; set; }
public Nullable<int> RolId { get; set; }
public Nullable<bool> OnayDurumu { get; set; }
public Nullable<bool> SurecTamam { get; set; }
public Nullable<bool> SurecAktif { get; set; }
public string surecrol_eposta { get; set; }
public Nullable<System.Guid> WEB_SURECROL_SURECTANIM_Guid { get; set; }
public virtual WEB_ROL WEB_ROL { get; set; }
public virtual WEB_SURECTANIM WEB_SURECTANIM { get; set; }
}
我的 Linq 表达式:
var Surecim = Surecler.Select(s=> new { s.SurecId , s.Damga}).Distinct().Join(
db.WEB_SURECROL.DefaultIfEmpty(),
SURECDAMGALAR => SURECDAMGALAR.SurecId,
SURECROLLER => SURECROLLER.SurecID,
(SURECDAMGALAR, SURECROLLER) => new { SURECDAMGALAR, SURECROLLER }).Join(Surecler,
surecTanim => new { surecTanim.SURECDAMGALAR.Damga,surecTanim.SURECROLLER.RolId },
SUREC_LIST => new { SUREC_LIST.Damga,SUREC_LIST.RolId },
(surecTanim,SUREC_LIST) => new {surecTanim,SUREC_LIST }
).Select(x=> new {
x.surecTanim.SURECROLLER.WEB_SURECTANIM.SurecAdi,
x.surecTanim.SURECROLLER.WEB_SURECTANIM.SurecTip,
x.SUREC_LIST.Damga,
x.SUREC_LIST.OnayDurumu,
x.surecTanim.SURECROLLER.WEB_ROL.RolAdi,
x.SUREC_LIST.SurecComplate,
x.SUREC_LIST.SurecAktif,
x.SUREC_LIST.RedDurumu,
x.SUREC_LIST.Aciklama,
x.SUREC_LIST.WEB_KULLANICI.GirisAdi,
x.SUREC_LIST.Tarih,
x.SUREC_LIST.IDonaypersonel,
});
Lambda 生成此 T-SQL 查询;
问题是;因为使用了Inner join,所以不会返回表中的所有值。
{SELECT
1 AS [C1],
[Extent4].[SurecAdi] AS [SurecAdi],
[Extent4].[SurecTip] AS [SurecTip],
[Extent3].[Damga] AS [Damga],
[Extent3].[OnayDurumu] AS [OnayDurumu],
[Extent5].[RolAdi] AS [RolAdi],
[Extent3].[SurecComplate] AS [SurecComplate],
[Extent3].[SurecAktif] AS [SurecAktif],
[Extent3].[RedDurumu] AS [RedDurumu],
[Extent3].[Aciklama] AS [Aciklama],
[Extent6].[GirisAdi] AS [GirisAdi],
[Extent3].[Tarih] AS [Tarih],
[Extent3].[IDonaypersonel] AS [IDonaypersonel]
FROM (SELECT DISTINCT
[Extent1].[Damga] AS [Damga],
[Extent1].[SurecId] AS [SurecId]
FROM [dbo].[WEB_KULLANICISUREC] AS [Extent1]
WHERE [Extent1].[Damga] = @p__linq__0 ) AS [Distinct1]
INNER JOIN (SELECT [Extent2].[SurecID] AS [SurecID], [Extent2].[RolId] AS [RolId]
FROM ( SELECT 1 AS X ) AS [SingleRowTable1]
LEFT OUTER JOIN [dbo].[WEB_SURECROL] AS [Extent2] ON 1 = 1 ) AS [Join1] ON ([Distinct1].[SurecId] = [Join1].[SurecID]) OR (([Distinct1].[SurecId] IS NULL) AND ([Join1].[SurecID] IS NULL))
INNER JOIN [dbo].[WEB_KULLANICISUREC] AS [Extent3] ON (([Distinct1].[Damga] = [Extent3].[Damga]) OR (([Distinct1].[Damga] IS NULL) AND ([Extent3].[Damga] IS NULL))) AND (([Join1].[RolId] = [Extent3].[RolId]) OR (([Join1].[RolId] IS NULL) AND ([Extent3].[RolId] IS NULL)))
LEFT OUTER JOIN [dbo].[WEB_SURECTANIM] AS [Extent4] ON [Join1].[SurecID] = [Extent4].[SurecId]
LEFT OUTER JOIN [dbo].[WEB_ROL] AS [Extent5] ON [Join1].[RolId] = [Extent5].[RolId]
LEFT OUTER JOIN [dbo].[WEB_KULLANICI] AS [Extent6] ON [Extent3].[IDonaypersonel] = [Extent6].[KullaniciId]
WHERE [Extent3].[Damga] = @p__linq__1}
如何让他使用 LeftJoin?
【问题讨论】:
-
你使用的是Entity还是SQLClient类?解决方案因您与数据库的连接而异。
-
我正在使用Entity,这个T-SQL解决了我的问题,但我尝试转换为lambda,不幸的是我没有成功