当其中之一具有join语句时,如何将c#Lambda表达式串在一起

时间:2019-06-07 22:36:39

标签: c# entity-framework lambda

我要把Lambda表达式串在一起 这就是我所拥有的。

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

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

但是现在,DefendantId已从Product表中删除,因此我需要在转折表(ProductDefendant)上添加join子句,同时仍返回

  

IQueryable<Product>

ProductDefendant表中同时具有ProductId和DefendantId。

下面是类似的内容,但是我不确定如何获取使用where子句的最后一部分,因为p.ProductDefendantList<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,但我想改用Lambda表达式。

这是门廊

            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和被告之间的联接

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 个答案:

答案 0 :(得分:1)

如果我对您的理解正确,则需要先在Product中选择ProductDefendantJoin,然后仅选择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);

答案 1 :(得分:1)

这种方式应该有效,

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