LINQ使用DISTINCT选择列表列表

Mau*_*uro 1 c# linq linq-to-sql

想象一下有一个类(和相应的db表)如下

class Price{
    int ItemID;
    int ItemTypeID;
    string ItemName;
    string ItemTypeName;
    float Price;
}
Run Code Online (Sandbox Code Playgroud)

我正在通过LINQ搜索新的查询以获取不同项目的列表(可能使用Take()和Skip()方法)并嵌套所有相关价格的列表.

有什么建议吗?

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

想象一下有3个"价格"如下

1, 1, Ball, Blue, 10 
1, 2, Ball, Red,  20 
2, 1, Frisbee, Blue, 30
Run Code Online (Sandbox Code Playgroud)

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

List<Item>

哪里

class Item
{
    string ItemName;
    string ItemTypeName;
    List<Price> Prices;
}
Run Code Online (Sandbox Code Playgroud)

class Price
{
    float Price;
}
Run Code Online (Sandbox Code Playgroud)

Mah*_*mal 5

使用Distinct(),像这样:

var results = _dbContext.Prices
    .Distinct()
    .Skip(15)
    .Take(5);
Run Code Online (Sandbox Code Playgroud)

编辑: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})
         });
Run Code Online (Sandbox Code Playgroud)

在此之后,你可以applay TakeSkip相同的方式,在第一个查询.

  • 这是搜索"distinct linq"时出现在谷歌搜索上的[第一件事](http://msdn.microsoft.com/en-us/library/system.linq.enumerable.distinct.aspx). (2认同)

cad*_*ll0 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();
Run Code Online (Sandbox Code Playgroud)