2012-07-02 243 views
1

列表想象有一个类(和相应的数据库表)如下LINQ选择列表与DISTINCT

class Price{ 
    int ItemID; 
    int ItemTypeID; 
    string ItemName; 
    string ItemTypeName; 
    float Price; 
} 

我seraching新通过LINQ查询它以获得不同的列表项目(可能使用Take()和Skip()方法)并嵌套所有关联价格的列表。

有什么建议吗?

编辑:为了使问题更简单这里有一个例子

试想一下,有3个“价格”为以下

1, 1, Ball, Blue, 10 
1, 2, Ball, Red, 20 
2, 1, Frisbee, Blue, 30 

我想将它们放在一个简化的结构

List<Item>

其中

class Item 
{ 
    string ItemName; 
    string ItemTypeName; 
    List<Price> Prices; 
} 

class Price 
{ 
    float Price; 
} 
+2

.Distinct()LINQ的运营商... –

回答

5

这听起来像也许你想要一个GroupBy。尝试这样的事情。

var result = dbContext.Prices 
    .GroupBy(p => new {p.ItemName, p.ItemTypeName) 
    .Select(g => new Item 
        { 
         ItemName = g.Key.ItemName, 
         ItemTypeName = g.Key.ItemTypeName, 
         Prices = g.Select(p => new Price 
                { 
                 Price = p.Price 
                } 
              ).ToList() 

        }) 
    .Skip(x) 
    .Take(y) 
    .ToList(); 
5

使用Distinct(),像这样:

var results = _dbContext.Prices 
    .Distinct() 
    .Skip(15) 
    .Take(5); 

编辑: 要使用价格对每个项目的列表填充List<Item>为你问你应该使用GROUPBY像这个:

var results = _dbContext.GroupBy(i => new { i.ItemName, i.ItemTypeName }) 
    .Select(g => new Item() 
     { 
      ItemName = g.Key.ItemName, 
      ItemTypeName = g.Key.ItemTypeName, 
      Prices = g.Select(p => new Price(){Price = p.Price}) 
     }); 

之后,您可以按照与第一个查询中相同的方式应用TakeSkip

+2

这是[第一件事情(http://msdn.microsoft.com/en-us/library/system.linq.enumerable.distinct.aspx)当搜索“不同的linq”时,它出现在Google搜索中。 –

+0

这将给出价格清单。我会更新问题以使其更清晰 – Mauro

+1

'.Take(5).Skip(15)'将始终导致一个空的枚举。我知道这只是一个样本,但我想我会指出它来消除混淆。为了清楚起见,我将两个电话交换。 –