如何将SELECT TOP 1 WITH TIES查询转换为LINQ C#?

时间:2018-10-15 15:08:39

标签: c# sql linq

我正在尝试执行具有平局的选择前1名,但是这样做很麻烦。

我需要orderdetails的所有最后记录,某些订单列表中可以包含多个文章。

var qry = (from ordd in db.OrderDetails
           join ord in db.Orders on ordd.OrderId equals ord.OrderId
           join cust in db.Salespersons on ord.SalespersonId equals cust.SalespersonId
           join comp in db.Companies on ord.CompanyId equals comp.CompanyId
           join pro in db.Products on ordd.ProductId equals pro.ProductId                              
           where (ord.OrderId == ordd.OrderId && pro.ProductId == ordd.ProductId)
           orderby ordd.OrderId descending
           select new { ordd })
           .Distinct()
           .ToList();

           foreach (var item in qry)
           {
               dt.Rows.Add(item.ordd.Reference, 
                           item.ordd.Quantity,
                           item.ordd.Description, 
                           item.ordd.Price, 
                           item.ordd.Price * item.ordd.Quantity);
           }

1 个答案:

答案 0 :(得分:1)

这是一个更通用的答案,使用自定义对象将更易于解释。
在要订购的字段上分组。这样,所有具有相同orderID的行都将在一起。
此键上的Order Desc,第一组将是所有具有最大orderID的行

var input = new Foo[] {
    new Foo{GroupId=1,Label="a" },
    new Foo{GroupId=2,Label="b" },
    new Foo{GroupId=3,Label="c" },
    new Foo{GroupId=3,Label="d" },
    new Foo{GroupId=2,Label="e" },
    new Foo{GroupId=4,Label="Bar" },
    new Foo{GroupId=4,Label="Bar" }
};

var result = input.Where(x => x.Label!="Bar")         //-> { a, b, c, d, e }
                    .GroupBy(x => x.GroupId)          //-> {1: a} {2: b, e} {3: c, d}
                    .OrderByDescending(x=> x.Key)     //-> {3: c, d} {2: b, e} {1: a} 
                    .First();