我很难找到解决方案,我确信这是一个简单的问题。
我在一个对象列表中创建了一个包含数据的应用程序。它的相关对象看起来像这样(非常简化):
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来创建值数组,但没有任何作用。当它涉及数据库语言时,我是一个相对新手。我无法在网络上的任何地方找到任何线索。也许我不是在问正确的问题。任何帮助表示赞赏。
答案 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(),
};