【问题标题】:Left Outer join Extension method linq左外连接扩展方法linq
【发布时间】:2019-03-20 11:01:56
【问题描述】:

我会用扩展方法翻译这个查询 我也会将此查询合并到一个带有扩展方法的查询中

var variants = _ctx.Varianti.Where(i=>i.attivo==0);

var allProducts = await (from p in  _ctx.Articoli
                         where  p.cat==1
                         join v in variants on p.code equals v.code into gj
                         from articoli in gj.DefaultIfEmpty()
                         select new {
                           Codart = p.Codart,
                           Codvar = articoli.Codvar,
                        }).ToListAsync(); 

我的课

类Articolo{ 公共字符串 Codart //key 公开双倍价格 }

类变量{ 公共字符串 Codart //key 公共字符串 Codvar // 密钥 公众态度 }

我必须这样退货

Prod1-Variant1 Prod2-(无变体) prod3-变体1 prod4-Variant1 prod4-Variant2 prod5-(无变体)

我应该只过滤带有 attivo==0 的变体 如果没有变体,所有产品都没有变体

代码运行良好,但我需要在对数据库的单个查询中进行优化 还有扩展方法

在T-Sql中应该是这样的:

SELECT Codart,
       Codvar
  FROM dbo.Articoli
       LEFT OUTER JOIN dbo.Varianti
           ON dbo.Articoli.Codart = dbo.Varianti.Codart
 WHERE (Cat = 1)
   AND (attivo = 0)

【问题讨论】:

  • 我不明白你的问题。你能:提供一些示例数据和示例类吗?你能改写你的问题吗?
  • 我希望我解释清楚...让我知道。再见
  • 由于 variants 是 IQuerable 它将是对数据库的单个查询。同样使用 lambda 语法而不是查询语法编写它对性能没有影响。但如果你真的想这样做,它就是这样做的:stackoverflow.com/a/584840/468973
  • 如果我在类文章中将导航属性添加到 Varianti 作为 List Varianti 那么可以提高性能吗?

标签: c# linq


【解决方案1】:

我仍然不确定是什么问题。这里有一些示例如何“左外连接”产品和变体并选择一个新对象。

List<Articolo> products = new List<Articolo>()
{
    new Articolo() { Code = "1", price = 1 },
    new Articolo() { Code = "2", price = 1 },
    new Articolo() { Code = "3", price = 1 },
    new Articolo() { Code = "4", price = 1 },
    new Articolo() { Code = "5", price = 1 },
};

List<Variante> variants = new List<Variante>()
{
    new Variante() { Code = "1", attivo = 0, Codvar = "v1" },
    new Variante() { Code = "3", attivo = 0, Codvar = "v1" },
    new Variante() { Code = "4", attivo = 0, Codvar = "v1" },
    new Variante() { Code = "4", attivo = 0, Codvar = "v2" },
    new Variante() { Code = "5", attivo = 1, Codvar = "v2" },
};

var result = products // Our "Left"-List 
    .GroupJoin( // Join to a "one"-to-"null or many"-List
        variants.Where(v => v.attivo == 0), // Our "right"-List
        p => p.Code, // select key in left list
        v => v.Code, // select key in right list
        (p, v) => // for every product "p" we have a list of variants "v"
            v.Any() ? // do we have vriants for our product?
                v.Select(s =>  new // for every variant we build our new product
                {
                    Code = p.Code,
                    FirstVariant = s.Codvar,
                })
                : // if we got no variants, we build a "no variant"-product
                new[] { new {
                    Code = p.Code,
                    FirstVariant = "No Variant"
                } } // here we got a list of product-variants per product ("list of lists")
            ).SelectMany(s => s); // We want one list of all product variants

foreach (var item in result)
{
    Console.WriteLine("Code: {0}, FirstVar: {1}", item.Code, item.FirstVariant);
}

【讨论】:

  • 连续我应该只有一个产品/变体......作为sql
  • @gigiLaTrottola 我修改了示例并添加了SelectMany()。现在,您为每个产品变体(包括没有变体的产品)获得了一个结果行。您可以通过删除 Any() 将它们排除在外
  • @gigiLaTrottola 不客气。随意接受并投票赞成我的答案:)
  • 每个人都可以接受自己问题的答案(在向上/向下按钮下方打勾)。你可以投票。当你有更多的声望时,积分将被授予。并且您会因接受答案而获得声誉积分 ;-)
  • 完成...对不起,我太累了,所以我没有看到支票:)
猜你喜欢
  • 1970-01-01
  • 2014-03-04
  • 2010-10-09
  • 1970-01-01
  • 2013-05-26
  • 1970-01-01
  • 2011-08-10
相关资源
最近更新 更多