【问题标题】:How to write left join, group by and average in c# entity framework Linq如何在c#实体框架Linq中编写left join、group by和average
【发布时间】:2017-06-19 07:52:13
【问题描述】:

简单来说,我需要在实体框架中编写以下 SQL。我宁愿在 Lynq 中进行。 我正在使用 mysql

SELECT `p`.`Id`, p.price, p.categoryid, avg(o.rate)
FROM `Product` AS `p`
LEFT JOIN `Order` AS `o` ON `p`.`Id` = `o`.`ProductId`
group by p.id 

到目前为止我所做的如下

var data = from p in _context.Product
           join o in _context.Order on p.Id equals o.ProductId into orderTemp
           from ord in orderTemp.DefaultIfEmpty()
           group p by p.Id into gp
           select new
           {
               p.Id,
               p.Price,
               p.CategoryId,
               gp.Average(m => m.Rate)
           };

我一整天都在为此苦苦挣扎。任何帮助都将非常有价值和感激。提前谢谢你。

上述方法不起作用,因为m 正在引用Product 的对象。

【问题讨论】:

  • group p by p.Id into gp 将产品组合在一起,您可以尝试 group by p.Id into gp 并查看 m 引用的对象。或者group by o.ProductId into gp,因为p.Ido.ProductId 无论如何都是相等的。
  • 尝试使用group by p.Id into gp select new { p.Id, p.Price, p.CategoryId, gp.Average(m => m.ord.rate)};m 引用的对象是 ord,其中包含连接的 Order 表。
  • 您的 sql 查询不应执行,因为您正在选择未在 group by 子句中列出的列。你试过在sql server中执行sql吗?
  • group by linq 中的有效术语。它给出了这个错误CS1525 Invalid expression term 'by'
  • @JenishRabadiya 是的,上面的 SQL 工作正常,并且给了我预期的结果。我正在使用 MySQL。我知道你的意思,但可能是因为 id 是主键,它是这样工作的。无论如何,假设我将查询更改为具有多个分组依据,即使在那时,您能帮我获得上述正确的 linq。

标签: c# entity-framework linq


【解决方案1】:

感谢所有试图帮助我的人。经过一番斗争,以下内容对我有用。

    var data = from p in _context.Product
        join o in _context.Order on p.Id equals o.ProductId into orderTemp
        from ord in orderTemp.DefaultIfEmpty()
        group ord by p into gp
        select new
        {
            Id = gp.Key.Id,                                        
            Price = gp.Key.Price,
            CategoryId = gp.Key.CategoryId,
            Rate = gp.Average(m => m == null ? 0 : m.Rate)
        };

【讨论】:

    【解决方案2】:

    您可以尝试从您的订单表中找到平均值,这里的问题是您需要选择左外连接结果,然后对其进行分组。

    (from p in products
     join o in Orders on p.id equals o.productId
     into pg
     from g in pg.DefaultIfEmpty()
     select  new { p.id, p.categoryId, p.price, g?.rate} into lg
     group lg by lg.id into sg
     from s in sg
     select new { s.id, s.price, rate =sg.Average(r=> r.rate)}).Distinct().ToList();
    

    【讨论】:

    • 谢谢@SAJ 我找到了解决方案,但我也会尝试这个解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-11
    • 2016-04-11
    • 2021-01-30
    • 1970-01-01
    相关资源
    最近更新 更多