Как связать вместе лямбда-выражения c #, когда в одном из них есть оператор соединения - PullRequest
0 голосов
/ 08 июня 2019

Я строю / объединяю лямбда-выражения Вот что у меня есть.

var products = context.Products.Select(c => c);

if (input.DefendantId != null)
{
       products = products
          .Where(p => p.DefendantId == input.DefendantId);
}

но теперь DefendantId был удален из таблицы Product, поэтому мне нужно добавить предложение объединения в таблицу трансляций (ProductDefendant), при этом возвращая

IQueryable<Product>

В таблице ProductDefendant содержатся как ProductId, так и DefendantId.

так что-то вроде этого ниже, но я не уверен, как получить последнюю часть, которая использует предложение where, потому что p.ProductDefendant это List<ProductDefendant>

if (input.DefendantId != null)
{
    products = products
        .Join(context.ProductDefendant, 
        p => p.Id, 
        pd => pd.ProductId, 
        (p, pd) => new Product())
        .Where(p => p.ProductDefendant.DefendantId == input.DefendantId);
}

Я написал это как linq, но вместо этого я хочу использовать лямбда-выражения.

Вот линк

            products =
                from p in products
                join pd in context.ProductDefendant
                    on p.Id equals pd.ProductId
                where pd.DefendantId == input.DefendantId
                select p;

и затем в самом конце я не могу получить код DefendantCode, который является соединением между ProductDefendant и Defendant

var productsVM = products.Select(c => new GetProductsReturnViewModel
        {
            Id = c.Id,
            ProductName = c.ProductName,
            DefendantCode = c.ProductDefendants.First().Defendant.DefendantCode // only gets teh first, not the correct code
        });

Ответы [ 2 ]

1 голос
/ 09 июня 2019

Этот способ должен работать,

var productsVM = products
    .Join(context.ProductDefendant,
        p => p.Id,
        pd => pd.ProductId,
        (p, pd) => new { Product = p, ProductDefendant = pd })
    .Where(joined => joined.ProductDefendant.DefendantId == input.DefendantId)
    .Select(joined => new GetProductsReturnViewModel
    {
        Id = joined.Product.Id,
        ProductName = joined.Product.ProductName,
        DefendantCode = joined.ProductDefendant.Defendant.DefendantCode
    });
1 голос
/ 08 июня 2019

Если я вас правильно понимаю, вам нужно сначала выбрать Product и ProductDefendant в вашем Join, а затем Select только часть Product после того, как Where отфильтрует результаты:

products = products
    .Join(context.ProductDefendant,
        p => p.Id, 
        pd => pd.ProductId,
        (p, pd) => new {Product = p, ProductDefendant = pd})
    .Where(joined => joined.ProductDefendant.DefendantId == input.DefendantId)
    .Select(joined => joined.Product);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...