Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对多列中出现的值进行计数_C#_Linq_Linq To Sql - Fatal编程技术网

C# 对多列中出现的值进行计数

C# 对多列中出现的值进行计数,c#,linq,linq-to-sql,C#,Linq,Linq To Sql,我正经历着一段艰难的时光,我确信这是一个简单的问题 我用对象列表中的数据启动了一个应用程序。它的相关对象通常如下所示(非常简化): 及 这很有效,我能够从查询中生成我想要的直方图。 现在我已转换为使用SQL数据库。我现在使用的表如下所示: MyTable { int Value1; int Value2; int Value3; int Value4; int Value5; int Value6; } 我有一个映射到DB的DataContext 我不知道如何翻译前面的

我正经历着一段艰难的时光,我确信这是一个简单的问题

我用对象列表中的数据启动了一个应用程序。它的相关对象通常如下所示(非常简化):

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

MyTable {
  int Value1;
  int Value2;
  int Value3;
  int Value4;
  int Value5;
  int Value6;
}
我有一个映射到DB的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创建值数组,但没有任何效果。谈到数据库语言,我是一个相对的新手。我只是在网上找不到任何线索。也许我问的问题不对。非常感谢您的帮助。

动态创建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() };

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

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() };

我在微软网站上得到了帮助。问题是混合使用LINQtoSQL和LINQtoObject

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(),
    };
以下是查询的说明方式:

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()};

工作起来很有魅力。

如果您希望使用LINQ to SQL,可以尝试我最近发现的这个“黑客”。它不是最漂亮最干净的代码,但至少您不必恢复使用LINQ对象

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(),
    };

我试过了-我得到了一个NotSupportedException,它说构造的数组只支持“Contains”这意味着什么。有趣。我对一种需要非常特殊的表组织才能使语言工作的解决方案有点怀疑。我认为林克的精神在于阿维德的回答。我希望我能让它工作。但是出于好奇,这个附件是在创建SQL表的过程中创建的吗?你是说样本中的一列连接到tavle值吗?我认为其中必须有一个join子句,当您编写LINQtoSQL查询时,它将被转换为SQL查询并发送到服务器。创建SQL是为了处理关系数据库。通过创建一个包含多个字段的表,实际上您正在创建一个平面数据库,SQL无法对其进行推理,即使LINQ可以(但无法将其转换为SQL)。当有两个表通过一对多关系(通过外键)链接在一起时,VS2008中的O/R映射器通常会在它们之间创建链接(如果没有,您可以手动创建),它在“一”对象上显示为属性,该对象是链接到它的“多”对象的集合(此属性是延迟加载的)。因此,对于每个样本对象,您将拥有一个Values属性,该属性是一个包含链接到该样本的所有值的集合。此外,如果您计划只使用所有值,而从不筛选要使用的样本,则您可以从Values表中选择所有记录,而不必遍历samples表。(这些评论中的人物限制让我发疯)请看:但这会在客户端进行分组和排序,这与LINQ to SQL的目的背道而驰。这还会将表的整个数据传输到客户端,而不仅仅是结果——对于任何大小合理的数据集来说,这不是一个好的解决方案。抱歉,但我真的认为您不理解LINQ的目的(任何风格的)。底线是,这正是我所做的事情所需要的。根本没有服务器-客户机体系结构。它都在一台机器上与本地数据库一起工作。
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()};
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(),
    };