2016-07-25 34 views
0

我有2列的数据表:LINQ的表集团通过在每一列获取Perecentage

GuitarBrand | Status 
--------------------- 
Fender  | Sold 
Fender  | In Stock 
Gibson  | In Stock 
Gibson  | In Stock 

我想写一个LINQ查询输出

GuitarBrand | PercentSold | Sold/Total 
--------------------------------------- 
Fender  | 50%   | 1/2 
Gibson  | 100%   | 2/2 

这是我到目前为止有:

var groupedtable = from b in table.AsEnumerable() 
    group b by b.Field<"GuitarBrand"> into g 
    select new (GuitarBrand = g.Key, Perecent = (float)g.Count()/(float)g.key) 

我从另一篇文章中得到的,但它甚至不接近工作,我得到一个无法转换字符串浮动。我试过看其他帖子,但我找不到任何东西。

谢谢!

+0

尝试'float.Parse(g.Count())'/'float.Parse(g.Count(g.key))' – din

+0

g.key是一个字符串,你不能用字符串分割数! –

回答

1

您可以使用下面的(希望言自明)查询:

var groupedtable = 
    from b in table.AsEnumerable() 
    group b by b.Field<string>("GuitarBrand") into g 
    let Total = g.Count() 
    let Sold = g.Count(e => e.Field<string>("Status") == "Sold") 
    let SoldPercent = (float)Sold/(float)Total 
    select new 
    { 
     GuitarBrand = g.Key, 
     PercentSold = SoldPercent.ToString("p"), 
     TotalSold = Sold + "/" + Total 
    }; 
1

也许是这样的!

var groupedtable = from b in table.AsEnumerable() 
    group b by b.Field<"GuitarBrand"> into g 
    select new { 
    GuitarBrand = g.Key, 
    Perecent = g.Count(x=>x.Status.Eguals("Sold")/(float)g.Count() 
    } 
0

像这样的东西应该让你开始。在你的问题中,你的输出表是矛盾的。我假设你想要标记的数据。

public static void Main() 
{ 
    var guitars = new List<Guitar>() 
    { 
     new Guitar(){ Brand = "Fender", Status = Status.Sold }, 
     new Guitar(){ Brand = "Fender", Status = Status.InStock }, 
     new Guitar(){ Brand = "Gibson", Status = Status.InStock }, 
     new Guitar(){ Brand = "Gibson", Status = Status.InStock } 
    }; 

    var query = guitars 
        .GroupBy(guitar => guitar.Brand) 
        .Select(group => new 
        { 
         GuitarBrand = group.Key, 
         Sold = group.Where(guitar => guitar.Status == Status.Sold).Count(), 
         Total = group.Count() 
        }) 
        .Select(_ => new 
        { 
         _.GuitarBrand, 
         PercentSold = ((decimal)_.Sold/(decimal)_.Total) * 100, 
         SoldAndTotal = string.Format("{0}/{1}", _.Sold, _.Total) 
        }); 
} 

class Guitar { 
    public string Brand { get; set; } 
    public Status Status { get; set; } 
} 

enum Status { 
    Sold, 
    InStock 
}