2014-01-31 32 views
1

一个价值观鲜明的List <订单明细>我的订单详细信息:如何基于从订单明细

public class OrderDetails 
    { 
     public int OrderId { get; set; } 
     // [DataMember] 
     public int ProductId { get; set; } 
    } 

现在,如果我做了不同的类似下面,它返回的一切:

List<OrderDetails> orderDetails = new List<OrderDetails>(); 
--------------------------------- 
return orderDetails.Distinct(); 

但如果我做不同的:

List<OrderDetails> orderDetails = new List<OrderDetails>(); 
    --------------------------------- 
return orderDetails.Select(x => x.OrderId).Distinct(); 

然后,我只得到订单ID。

我怎样才能根据的OrderId

+2

使用'.Where(x => x.OrderId == 4)' – TGlatzer

+0

'.Select'将只返回选定的成员,所以请使用'where' – 2014-01-31 11:17:06

回答

0

含混订单明细(包括订单ID和产品编号)尝试下面的代码:

DISTINCT与OrderId

return orderDetails.GroupBy(x => x.OrderId).Select(g => g.First()).ToList(); 

DISTINCT与OrderIdProductId

return orderDetails.GroupBy(x => new {x.OrderId, x.ProductId}).Select(g => g.First()).ToList(); 
+0

这是怎么工作的? .Disinct期望一个IEquator,你正在传递一个func! – Simsons

+0

我更新了答案! –

+0

第一组通过属性您想要不同的结果,然后选择组的第一项。 –

0

你可以创建需要一个Order Id的方法,并返回下面的列表...

public List<OrderDetails> GetDistinctOrderDetails(int orderId) 
{ 
    List<OrderDetails> orderDetails = GetAllOrders(); 
    return orderDetails.Where(x => x.OrderId == orderId).Distinct(); 
} 
1

可以使用的Distinct超载这需要IEqualityComparer<TSource>作为比较器。

您可以将其定义为:

public class OrderDetailsEqualityComparer : IEqualityComparer<OrderDetails> 
{ 
    public bool Equals(OrderDetails x, OrderDetails y) 
    { 
     if (object.ReferenceEquals(x, y)) 
     { 
      return true; 
     } 

     if (object.ReferenceEquals(x, null) || object.ReferenceEquals(y, null)) 
     { 
      return false; 
     } 

     return (x.OrderId == y.OrderId); 
    } 

    public int GetHashCode(Product obj) 
    { 
     return obj.OrderId.GetHashCode(); 
    } 
} 

,并用它作为:

var osrderedOrderDetails = 
     orderDetails.Distinct(new OrderDetailsEqualityComparer()); 
+0

你也可以在类本身实现equals和GetHashCode – Aron

+0

@Aron,我认为这不是个好主意。在这种情况下,您可以定义实体之间的平等关系,这可能不是必需的。 –

0
return orderdetails.Where(a=>a.OrderID == _inputvalue).ToArray(); 

“指定者”可以是任何什么都需要 除非你的函数的集合类型返回Ienumerable <>那么你不需要它

使用不同的( )是不是一个好主意,因为它会掉落行

0

实现IEquatable接口:

public class OrderDetails : IEquatable<OrderDetails> 
{ 
    public int OrderId { get; set; } 

    public int ProductId { get; set; } 

    public bool Equals(OrderDetails anotherOrder) 
    { 
     return this.OrderId.Equals(anotherOrder.OrderId); 
    } 

    public override int GetHashCode() 
    { 
     return this.OrderId; 
    } 
} 

现在,尝试orderDetails.Distinct();

相关问题