【问题标题】:Left Join using LAMBDA to get Result in APILeft Join 使用 LAMBDA 在 API 中获取结果
【发布时间】:2019-02-28 19:49:06
【问题描述】:

如何使用 LAMBDA 将下面代码中的 Join 实现到 C# 中

Select 
        VD.Id
        , VD.BusinessAddress
        , VD.BusinessDesc
        , VD.BusinessEmail
        , VD.BusinessName
        , VD.BusinessZip
        , VD.ContactPerson
        , VD.ContactNo
        , VD.ProfileUrl
        , L.Name
        , BC.BusinessCategory

        from vendorDomain VD WITH(NOLOCK)
        left Join Location L WITH(NOLOCK) ON VD.City = L.Id
        left join Business_Category BC WITH(NOLOCK) ON VD.BusinessCategory = BC.BusinessId

where VD.IsDeleted = 0

我必须在以下 API 中实现连接操作:

[HttpGet]
    public async Task<IActionResult> Get()
    {
        var VendorList =await _vendorRepository.Query().Where(x => x.IsDeleted == false).ToListAsync();

        return Ok(VendorList);

    }

那里有很多示例,但对于新手开发人员来说是一种困惑..

编辑:

这是我目前尝试过的:

var employees = from vndr in context.vendorDomain
                        join C in context.Location on vndr.City equals C.Id into dep
                        from dept in dep.DefaultIfEmpty()

                        select new

                        {
                            vndr.BusinessAddress,
                            vndr.BusinessDesc,
                            vndr.BusinessEmail,
                            vndr.BusinessName,
                            vndr.BusinessWebsite,
                            vndr.BusinessZip,
                            vndr.ContactNo,
                            vndr.ContactPerson,
                            vndr.Created_At,
                            vndr.ProfileUrl,
                            vndr.Url,
                            dept.Name
                        };

【问题讨论】:

  • 您只是想将 sql 查询转换为 linq,还是想以某种方式将其与 VendorList 变量合并?
  • @Marco 我需要将城市名称和业务类别添加到 VendorList 表中
  • 再次:您只是需要将 SQL 查询转换为 LINQ 查询还是需要更多 - 即以某种方式使用 VendorList 变量?
  • 加入后我要打印VendorList

标签: asp.net-web-api lambda left-join


【解决方案1】:

我们将首先做一些事情:进行连接并创建一个您将返回的视图模型类。因为返回匿名对象并使用dynamic 确实会变得混乱。

连接实体的视图模型:

public class EmployeesViewModel
{
    public string BusinessAddress { get; set; } 
    public string BusinessDesc { get; set; } 
    public string BusinessEmail { get; set; } 
    /* ....all remaining properties */
}

然后我们正确地加入它们并选择它们作为EmployeeViewModel

var employees = from vndr in context.vendorDomain
                join loc in context.Location on vndr.City equals loc.Id
                join bus in context.Business_Category on vndr.BusinessCategory = bus.BusinessId
                select new EmployeeViewModel
                {
                    BusinessAddress = vndr.BusinessAddress,
                    BusinessDesc = vndr.BusinessDesc,
                    BusinessEmail = vndr.BusinessEmail,
                    /* ... remaining properties here*/
               };

或者,如果你想要方法语法:

var employees = context.vendorDomain
                .Join(context.Location,
                       vndr => vndr.City,
                       loc => loc.Id,
                       (vndr, loc) => new { vndr, loc,})
                .Join(context.Business_Category,
                       vndr_loc.vndr.BusinessCategory,
                       bus.BusinessId,
                       (vndr_loc, bus) => new {vndr_loc.vndr, vndr_loc.loc, bus})
                .Select(x => new EmployeeViewModel{
                    BusinessAddress = vndr.BusinessAddress,
                    BusinessDesc = vndr.BusinessDesc,
                    BusinessEmail = vndr.BusinessEmail,
                    /* ... remaining properties here*/
                });

根据您的评论,您需要在加入后打印 vendorList。现在这很模糊,但我假设您想将两者都提交给您的客户端/视图,所以我们再次为它创建一个 ViewModel 类:

public class EmployeeVendorListViewModel
{
   public VendorList VendorList { get; set; }
   public EmployeeViewModel Employees { get; set; }
}

我们要做的最后一件事是在 ActionMethod 中将它们粘合在一起并返回:

[HttpGet]
public async Task<IActionResult> Get()
{
    //renamed using a lower case "v"
    var vendorList = await _vendorRepository.Query()
                         .Where(x => x.IsDeleted == false)
                         .ToListAsync();

    //the join from earlier. You should put it in a repo somewhere, so it does not clutter your controller
    var employees = from vndr in context.vendorDomain
                    join loc in context.Location on vndr.City equals loc.Id
                    join bus in context.Business_Category on vndr.BusinessCategory = bus.BusinessId
                    select new EmployeeViewModel
                    {
                        BusinessAddress = vndr.BusinessAddress,
                        BusinessDesc = vndr.BusinessDesc,
                        BusinessEmail = vndr.BusinessEmail,
                        /* ... remaining properties here*/
                    };
    //create the final view model and return it
    var vm = new EmployeeVendorListViewModel 
    {
        VendorList = vendorList,
        Employees = employees
    }

    return Ok(vm);
}

如果您想在查询中使用NOLOCK,则必须将其包装在TransactionScope 中。这已经在 StackOverflow 上得到了回答:NOLOCK with Linq to SQL

【讨论】:

  • 谢谢马可。还想问是否所有这些都可以使用 Lambda 表达式来完成?
  • 我已经更新了我的答案。不过,我个人会选择查询语法。它更具可读性和简洁性。
  • 很高兴我能提供帮助。
  • 我需要一些帮助来编写另外一个代码,如果你能帮助我吗?
  • 只问一个关于 SO 的新问题。这就是全部内容;)
猜你喜欢
  • 2021-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-06
  • 2018-02-28
  • 2014-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多