Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.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# 将sql语句转换为linq时出现问题_C#_Sql_Linq - Fatal编程技术网

C# 将sql语句转换为linq时出现问题

C# 将sql语句转换为linq时出现问题,c#,sql,linq,C#,Sql,Linq,我已经通读了101个linq样本,它们似乎有我正在尝试做的部分,但在组合它们时遇到了困难。我有一个类似这样的查询,它将我的“客户”与一些“订单”值(例如,所有订单的总数和订单数量)关联起来 我知道如何进行左外连接,但我确实看到了不分组求和的方法?我看不到任何将求和分组然后将此结果返回到另一个select的示例 var x = from c in db.Customers join o in db.Orders on c.UserID equals o.UserID into o

我已经通读了101个linq样本,它们似乎有我正在尝试做的部分,但在组合它们时遇到了困难。我有一个类似这样的查询,它将我的“客户”与一些“订单”值(例如,所有订单的总数和订单数量)关联起来

我知道如何进行左外连接,但我确实看到了不分组求和的方法?我看不到任何将求和分组然后将此结果返回到另一个select的示例

var x = 
    from c in db.Customers
    join o in db.Orders on c.UserID equals o.UserID into oo
    from o in oo.DefaultIfEmpty()
    select new { FirstName = c.FirstName, SUM??(o.Total),  };

在这一点上,我似乎只是在转动我的轮子。任何帮助都将不胜感激。

您可以在加入后执行
分组。结果应该完全相同:

var x = from c in db.Customers
            join o in db.Orders on c.UserID equals o.UserID into oo
            from o in oo.DefaultIfEmpty()
            group new { c, o } by c.UserID into g
            select new {
                Customer = g.FirstOrDefault().c,
                Total = g.Sum(x => x.o.Total)
                Count = g.Select(x => x.o.OrderId).Distinct().Count()
            };

g、 计数(x=>x.o.OrderID…这需要一个布尔值…我不确定测试条件是什么,因为我只需要一个行数。我已经更新了答案,但我不确定它是否能正确转换为SQL。太棒了,谢谢。我必须做一个更改来过滤掉空值,因为我总是得到至少1个返回顺序。不确定这是否是fastest-way:ordersont=g.Where(p=>p.o.OrderID!=null)。选择(x=>x.o.OrderID)。Distinct().Count()您可以尝试将谓词移动到
Count
ordersont=g.Select(x=>x.o.OrderID)。Distinct().Count(p=>p.o.OrderID!=null)
您是linq主控器。对您上次的编辑进行了一个小的更正。因为此时它只有值,所以我更改为:ordersont=g.Select(x=>x.o.OrderID).Distinct().Count(x=>x!=null)
var x = from c in db.Customers
            join o in db.Orders on c.UserID equals o.UserID into oo
            from o in oo.DefaultIfEmpty()
            group new { c, o } by c.UserID into g
            select new {
                Customer = g.FirstOrDefault().c,
                Total = g.Sum(x => x.o.Total)
                Count = g.Select(x => x.o.OrderId).Distinct().Count()
            };