Подсчет вхождений значений в нескольких столбцах - PullRequest
1 голос
/ 04 января 2010

Мне ужасно трудно найти решение, которое, я уверен, является простой проблемой.

Я запустил приложение с данными в списках объектов. Это уместные объекты, которые раньше выглядели так (очень упрощенно):

class A {  
    int[] Nums;  
}

и

List<A> myListOfA;

Я хотел посчитать вхождения значений в массиве-члене по всему списку.

Я нашел это решение как-то:

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 () в конце - то, что я видел где-то еще. Я пытался использовать группу для создания массива значений, но ничего не работает. Я относительный новичок, когда дело доходит до языков баз данных. Я просто не могу найти никакой подсказки в Интернете. Может быть, я не задаю правильный вопрос. Любая помощь приветствуется.

Ответы [ 4 ]

1 голос
/ 06 января 2010

Я получил помощь на сайте Microsoft. Проблема заключается в смешении 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()};

Работает как шарм.

0 голосов
/ 12 марта 2011

Если вы хотите использовать LINQ to SQL, вы можете попробовать этот «взлом», который я недавно обнаружил. Это не самый красивый и чистый код, но по крайней мере вам не придется возвращаться к использованию 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(),
    };
0 голосов
/ 05 января 2010

В реляционной базе данных, такой как SQL Server, коллекции представлены в виде таблиц. Таким образом, у вас должно быть две таблицы - Samples и Values. Таблица ключей будет представлять один объект «А», а таблица значений будет представлять каждый элемент в A.Nums, а внешний ключ указывает на одну из записей в таблице Samples. LINQ to SQL Затем O / R mapper создаст свойство «Значения» для каждого объекта Sample, который содержит запрашиваемую коллекцию прикрепленных значений. Затем вы будете использовать следующий запрос:

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() };
0 голосов
/ 04 января 2010

Как насчет создания массива 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() };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...