Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ-通过Group by进行多连接并获得平均值_C#_Linq_Join_Average - Fatal编程技术网

C# LINQ-通过Group by进行多连接并获得平均值

C# LINQ-通过Group by进行多连接并获得平均值,c#,linq,join,average,C#,Linq,Join,Average,我正在尝试用LINQ写这个选择,但是我很长时间都没有成功地修复它。我也试过了,但在我的代码中不起作用。很明显,我错了 SQL: 林克: var q3 = from l in db.location join tp in db.type on l.ID_type equals tp.ID join e in db.event on l.ID equals u.ID_location join t in db.ticket on e.ID equals t.ID_event group tp by

我正在尝试用LINQ写这个选择,但是我很长时间都没有成功地修复它。我也试过了,但在我的代码中不起作用。很明显,我错了

SQL:

林克:

var q3 = from l in db.location
join tp in db.type on l.ID_type equals tp.ID
join e in db.event on l.ID equals u.ID_location
join t in db.ticket on e.ID equals t.ID_event 
group tp by new {Type_name = tp.type_name} into grp
select new
{
     Type_name = grp.Key.type_name,
     avgPrice = grp.Average( x => x.ticket.price)
};

有几个问题:

  • 第二个连接中有错误-我认为
    u.ID\u位置
    需要
    e.ID\u位置
  • 我认为您在错误的实体上分组,请尝试按
    t
    而不是
    tp
    进行分组
  • 您不需要在
    分组依据
    中使用匿名类型
  • 试试这个:

    var results = 
         from l in db.location
         join tp in db.type on l.ID_type equals tp.ID
         join e in db.event on l.ID equals e.ID_location
         join t in db.ticket on e.ID equals t.ID_event 
         group t by new tp.type_name into grp
         select new
         {
              Type_name = grp.Key,
              avgPrice = grp.Average(x => x.price)
         };
    
    如果您碰巧在实体之间设置了导航属性,这将容易得多。很难说实体之间应该是如何关联的,但我认为这样做是可行的:

    // average ticket price per location type
    var results = 
        from t in db.ticket
        group t by t.event.location.type.type_name into g
        select new
        {
             Type_name = g.Key,
             avgPrice = g.Average(x => x.price)
        }; 
    
    或使用流利的语法:

    var results = db.ticket.GroupBy(t => t.event.location.type.type_name)
                           .Select(g => new 
                                   { 
                                       Type_name = g.Key, 
                                       avgPrice = g.Average(x => x.price) 
                                   }); 
    

    非常感谢你!它工作得很好:)现在我可以去尝试更难的选择。。。
    var results = db.ticket.GroupBy(t => t.event.location.type.type_name)
                           .Select(g => new 
                                   { 
                                       Type_name = g.Key, 
                                       avgPrice = g.Average(x => x.price) 
                                   });