Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Новый топик    Ответить
 Linq подзапрос  [new]
khSerg
Member

Откуда:
Сообщений: 35
Подскажите как переделать запрос в LINQ:

SELECT таблица1.por, Count(таблица1.countR) AS [Count-countR]
FROM таблица1, (SELECT por AS pr, max(CountR) AS cr FROM таблица1 GROUP BY por)  AS t
WHERE ((таблица1.countR=[cr]) AND (таблица1.por=[pr]))
GROUP BY таблица1.por;

Я не могу разобраться с вложенным под запросом, чтобы его потом использовать в WHERE...
7 июн 10, 16:24    [8903578]     Ответить | Цитировать Сообщить модератору
 Re: Linq подзапрос  [new]
pation
Member

Откуда: Москва
Сообщений: 4498
как-то так
class JoinKey
    {
      public int pr { get; set; }

      public int cr { get; set; }

      public override int GetHashCode()
      {
        return pr ^ cr;
      }

      public override bool Equals(object obj)
      {
        var k = obj as JoinKey;
        return k != null && k.GetHashCode().Equals(GetHashCode());
      }
    }

//
//
//

var value = tab1.GroupBy(t => t.por).Select(t => new JoinKey { pr = t.Key, cr = t.Max(tt => tt.CountR) }).Join(tab1, a => a, t => new JoinKey { pr = t.por, cr = t.CountR }, (a, t) => t).GroupBy(t => t.por).Select(t => new { por = t.Key, Count_countR = t.Count() });
8 июн 10, 13:41    [8908059]     Ответить | Цитировать Сообщить модератору
 Re: Linq подзапрос  [new]
МСУ
Member [заблокирован]

Откуда: http://codearticles.ru
Сообщений: 31089
from t in db.table1s
from t0 in (
	(from t01 in db.table1s
	group t01 by new {
	  t01.por
	} into g
	select new {
	  pr = (System.Int32?)g.Key.por,
	  cr = g.Max(p => p.countR)
	}))
where
  t.countR == t0.cr &&
  t.por == t0.pr
group t by new {
  t.por
} into g
select new {
  por = (System.Int32?)g.Key.por,
  Count-countR = g.Count()
}
8 июн 10, 14:58    [8908941]     Ответить | Цитировать Сообщить модератору
 Re: Linq подзапрос  [new]
khSerg
Member

Откуда:
Сообщений: 35
Super! Да, я только в начале пути освоения LINQ :) тяжелая строчка...только немного не то выдает :(
здесь получатся count строк по por, а мне необходимо число групп с макс числом countR, т.е.
por | countR  
 1  | 2
 1  | 1
 2  | 2
 2  | 1
будет
por | count_countR 
 1  | 1
 2  | 1
8 июн 10, 15:06    [8909022]     Ответить | Цитировать Сообщить модератору
 Re: Linq подзапрос  [new]
МСУ
Member [заблокирован]

Откуда: http://codearticles.ru
Сообщений: 31089
Вы о каком запросе, о pation или о моём?

+ ...
var db = new DataClassesDataContext();
var x = from t in db.table1s
        from t0 in
            (
                (from t01 in db.table1s
                    group t01 by new
                    {
                        t01.por
                    } into g
                    select new
                    {
                        pr = (System.Int32?)g.Key.por,
                        cr = g.Max(p => p.countR)
                    }))
        where
            t.countR == t0.cr &&
            t.por == t0.pr
        group t by new
        {
            t.por
        } into g
        select new
        {
            por = (System.Int32?)g.Key.por,
            CountCountR = g.Count()
        };
8 июн 10, 15:14    [8909111]     Ответить | Цитировать Сообщить модератору
 Re: Linq подзапрос  [new]
khSerg
Member

Откуда:
Сообщений: 35
эх, описывал подробнее ситуацию, а уже правильный ответ прислали :))
Второй вариант от МСУ правильный...спасибо большое!
Будем дальше осваивать...
8 июн 10, 15:14    [8909115]     Ответить | Цитировать Сообщить модератору
 Re: Linq подзапрос  [new]
khSerg
Member

Откуда:
Сообщений: 35
Странно я пробовал подобную конструкцию только
from t0 in (
	(from t01 in Table_1s
	group t01 by new {
	  t01.Por
	} into g
	select new {
	  pr = g.Key.Por,
	  cr = g.Max(p => p.CountR)
	}))
я в let засовывал...
8 июн 10, 15:23    [8909188]     Ответить | Цитировать Сообщить модератору
 Re: Linq подзапрос  [new]
pation
Member

Откуда: Москва
Сообщений: 4498
сори за неправильный ответ GetHashCode не правильно составил
нужно:
class JoinKey
  {
    public int pr { get; set; }

    public int cr { get; set; }

    public override int GetHashCode()
    {
      //return pr ^ cr;
      //неправильно, получается 1,2==2,1
      return string.Format("{0}-{1}", pr, cr).GetHashCode();
    }

    public override bool Equals(object obj)
    {
      var k = obj as JoinKey;
      return k != null && k.GetHashCode().Equals(GetHashCode());
    }
  }
8 июн 10, 15:55    [8909564]     Ответить | Цитировать Сообщить модератору
 Re: Linq подзапрос  [new]
khSerg
Member

Откуда:
Сообщений: 35
Да и этот вариант теперь правильный...
только для моего понимания тяжеловат:))уж извините...
Спасибо всем большое...а то я уже хотел отказываться от LINQ :((
а так буду дальше его мучать! :)
8 июн 10, 16:12    [8909760]     Ответить | Цитировать Сообщить модератору
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Ответить