【问题标题】:Stored procedure to linq - specific SP存储过程到 linq - 特定的 SP
【发布时间】:2020-07-07 09:50:27
【问题描述】:

我正在尝试将以下 SP 转换为 linq,但它给了我不同的结果,我似乎无法弄清楚为什么......

这是sql中的SP:

ALTER PROCEDURE [dbo].[XPTO]
    @resourceName varchar(200),
    @resourceType varchar(10),
    @culture varchar(2),
    @restricted bit,
    @draft bit = 0,
    @tenantId bigint
AS
    select *,
    resourceDocument.resourceDocument as Document   
from 
    Resource inner join
    ResourceType on Resource.resourceTypeId = ResourceType.resourceTypeId left outer join
    ResourceDocument on resourceDocument.resourceId = Resource.resourceId
    left outer join [language] as l on l.languageId=resourceDocument.languageId
where 
    Resource.tenantId=@tenantId and
    Resource.name = @resourceName and ResourceType.abbreviation = @resourceType and
    ((@restricted = 1 and Resource.accessLevel = 2) or @restricted <> 1) and
    (@culture is null or l.abbreviation = @culture)

这是我的 linq 代码:

 var stuff = from res in db.Resource
                            join resType in db.ResourceType
                            on res.Type.Id equals resType.Id
                            join resDocument in db.ResourceDocument.DefaultIfEmpty()
                            on res.Id equals resDocument.Resource.Id
                            join lang in db.Languages.DefaultIfEmpty()
                            on resDocument.Language.Id equals lang.Id
                            where res.Tenant.Id == tenantId
                            && res.Name == resourceName
                            && resType.Abbreviation == resourceType
                            && ((restricted == true && res.AccessLevel.Id == 2) || restricted != true)
                            && culture == null || lang.Abbreviation == culture
                            select new
                            {
                                res,
                                resType,
                                resDocument,
                                lang,
                                Document = resDocument.Resource.ResourceDocument
                            };

    var lambda = db.Resource
                    .Join(db.ResourceType, a => a.Type.Id, b => b.Id,
                    (a, b) => new { a, b })
                    .Join(db.ResourceDocument, c => c.a.Id, d => d.Resource.Id,
                    (c, d) => new { c, d }).DefaultIfEmpty()
                    .Join(db.Languages, e => e.d.Language.Id, f => f.Id,
                    (e, f) => new { e, f }).DefaultIfEmpty()
                    .Where(x => x.e.c.a.Tenant.Id == tenantId
                        && x.e.c.a.Name == resourceName
                        && x.e.c.a.Type.Abbreviation == resourceType
                        && ((restricted == true && x.e.c.a.AccessLevel.Id == 2) || restricted != true)
                        && culture == null || x.f.Abbreviation == culture)
                    .Select(m => new
                    {
                        m.e.c.a,
                        m.e.c,
                        m.e,
                        Document = m.e.c.a.ResourceDocument
                    });

你能帮帮我吗?这两个 linq 给了我相同的结果,但与原来的 sp 不一样......提前谢谢:)

【问题讨论】:

    标签: c# sql linq


    【解决方案1】:

    对于Left Outer Join,诀窍是使用join ... into,然后在LINQ结果中使用DefaultIfEmpty()进行分组:

    var stuff = from res in db.Resource
                        join resType in db.ResourceType
                        on res.Type.Id equals resType.Id
                        join resDocument in db.ResourceDocument
                        on res.Id equals resDocument.Resource.Id into resourceGroup
                        from resGroup in resourceGroup.DefaultIfEmpty()
                        join lang in db.Languages
                        on resDocument.Language.Id equals lang.Id into languageGroup
                        from langGroup in languageGroup.DefaultIfEmpty()
                        where res.Tenant.Id == tenantId
                        && res.Name == resourceName
                        && resType.Abbreviation == resourceType
                        && ((restricted == true && res.AccessLevel.Id == 2) || restricted != true)
                        && culture == null || lang.Abbreviation == culture
                        .Select(m => new
                        {
                            //select what you need here
                        });
    

    这是reference for Left Outer Join 使用 LINQ。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2013-05-03
      • 1970-01-01
      • 2010-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多