Оставьте соединение, используя LAMBDA, чтобы получить результат в API - PullRequest
0 голосов
/ 28 февраля 2019

Как реализовать это объединение, которое в коде ниже, в C # с использованием LAMBDA

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
                        };

1 Ответ

0 голосов
/ 28 февраля 2019

Сначала мы сделаем все: создайте соединения и создайте класс модели представления, который вы вернете.Поскольку возвращение анонимного объекта и использование dynamic действительно приводит к путанице.

ViewModel для присоединяемых объектов:

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 с Linq to SQL

...