计算跨多个列的值的出现次数

时间:2010-01-04 19:26:52

标签: c# linq linq-to-sql

我很难找到解决方案,我确信这是一个简单的问题。

我在一个对象列表中创建了一个包含数据的应用程序。它的相关对象看起来像这样(非常简化):

class A {  
    int[] Nums;  
}

List<A> myListOfA;

我想计算所有List中成员数组中值的出现次数。

我以某种方式找到了这个解决方案:

var results  
    from a in myListOfA  
    from n in a.Nums  
    group n by n into g
    orderby g.Key
    select new{ number = g.Key, Occurences = g.Count}

int NumberOfValues = results.Count();

效果很好,我能够从查询中生成我想要的直方图。 现在我转换为使用SQL数据库。我现在使用的表格如下:

MyTable {
  int Value1;
  int Value2;
  int Value3;
  int Value4;
  int Value5;
  int Value6;
}

我有一个映射到数据库的DataContext。

我无法弄清楚如何翻译以前的LINQ语句来使用它。我试过这个:

MyDataContext myContext;

var results =
    from d in myContext.MyTable
    from n in new{ d.Value1, d.Value2, d.Value3, d.Value4, d.Value5, d.Value6 }
    group n by n into g
    orderby g.Key
    select new { number = g.Key, Occurences = g.Count() };

我在构造的数组上尝试了一些变体,比如在最后添加.AsQueryable() - 我在其他地方看到的东西。我尝试使用group来创建值数组,但没有任何作用。当它涉及数据库语言时,我是一个相对新手。我无法在网络上的任何地方找到任何线索。也许我不是在问正确的问题。任何帮助表示赞赏。

4 个答案:

答案 0 :(得分:1)

我在微软网站上获得了帮助。问题是将LINQ to SQL与LINQ to Objects混合。

这是查询的陈述方式:

var results = 
    from d in MyContext.MyTable.AsEnumerable()
    from n in new[]{d.Value1, d.Value2, d.Value3, d.Value4, d.Value5, d.Value6}
    group n by n into g
    orderby g.Key
    select new {number = g.Key, Occureneces = g.Count()};

像魅力一样。

答案 1 :(得分:0)

如何动态创建int数组?

var results =
    from d in myContext.MyTable
    from n in new  int[] { d.Value1, d.Value2, d.Value3, d.Value4, d.Value5, d.Value6 }
    group n by n into g
    orderby g.Key
    select new { number = g.Key, Occurences = g.Count() };

答案 2 :(得分:0)

在关系数据库(如SQL Server)中,集合表示为表。所以你应该有两个表 - 样本和值。 Keys表表示单个“A”对象,而Values表表示A.Nums中的每个元素,外键指向Samples表中的一个记录。 LINQ to SQL 然后,O / R映射器将为每个Sample对象创建一个“Values”属性,该属性包含一个可查询的附加值集合。然后,您将使用以下查询:

var results = 
    from sample in myContext.Samples
    from value in sample.Values
    group value by value into values
    orderby values.Key
    select new { Value = values.Key, Frequency = values.Count() };

答案 3 :(得分:0)

如果你想使用LINQ to SQL,你可以尝试我最近发现的这个“hack”。它不是最干净最干净的代码,但至少你不必恢复使用LINQ to Objects。

var query = 
    from d in MyContext.MyTable
    let v1 = MyContext.MyTable.Where(dd => dd.ID == d.ID).Select(dd => dd.Value1)
    let v2 = MyContext.MyTable.Where(dd => dd.ID == d.ID).Select(dd => dd.Value2)
    // ...
    let v6 = MyContext.MyTable.Where(dd => dd.ID == d.ID).Select(dd => dd.Value6)
    from n in v1.Concat(v2).Concat(v3).Concat(v4).Concat(v5).Concat(v6)
    group 1 by n into g
    orderby g.Key
    select new
    {
        number = g.Key,
        Occureneces = g.Count(),
    };