Гость
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Помогите составить LINQ запрос / 10 сообщений из 10, страница 1 из 1
12.12.2012, 10:13
    #38075225
csharp-noob
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите составить LINQ запрос
Приветствую!
Есть вот такой запрос на MS SQL
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
declare @t table (
id int, 
inn int,
inn2 int,
filename varchar(30),
date datetime
)

insert into @t
select '1' as id, '111' as inn, '222' as inn2, 'abcd' as filename, '2011.01.01' as date
union
select '2' as id, '111' as inn, '222' as inn2, 'abcde' as filename, '2011.01.01' as date
union 
select '3' as id, '111' as inn, '222' as inn2, 'abcdeg' as filename, '2011.01.02' as date
union 
select '4' as id, '111' as inn, '222' as inn2, 'abcdeg1' as filename, '2011.01.03' as date
union
select '5' as id, '333' as inn, '4444' as inn2, 'dddbcdeg1' as filename, '2011.01.01' as date
union 
select '6' as id, '333' as inn, '4444' as inn2, 'fdddbcdeg1' as filename, '2011.01.02' as date
union 
select '7' as id, '333' as inn, '4444' as inn2, 'fdddbcdeg2' as filename, '2011.01.02' as date
union 
select '8' as id, '333' as inn, '4444' as inn2, 'fdddbcdeg1' as filename, '2011.01.03' as date
union 
select '9' as id, '333' as inn, '4444' as inn2, 'fdddbcdeg2' as filename, '2011.01.03' as date


select *  from @t t
where date = (select date from @t t1 
where t.inn=t1.inn and t.inn2=t1.inn2 and t.date=t1.date
group by date, inn, inn2 having count(date)>1 )
and id = (select min(id) from @t tt where  t.date=tt.date and t.inn=tt.inn and t.inn2=tt.inn2)
union
select * from @t t 
where date = (select date from @t t1
where t.inn=t1.inn and t.inn2=t1.inn2 and t.date=t1.date
group by date, inn, inn2 having count(date)=1 )



Помогите написать аналог запроса на LINQ NET 4.0.
...
Рейтинг: 0 / 0
12.12.2012, 12:50
    #38075605
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите составить LINQ запрос
csharp-noob,

сначала предлагаю оптимизировать ваш sql запрос
...
Рейтинг: 0 / 0
13.12.2012, 06:07
    #38076948
csharp-noob
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите составить LINQ запрос
pation,

Принимается! задал вопрос в другой ветке по поводу оптимизации запроса, у самого знаний не хватаети мысли закончились. Просто хотелось средствами C# с помощью LINQ написать проверку уникальности, в принципе можно сделать и процедурой, но это не айс, как я понимаю, в свете последних рекомендаций....
...
Рейтинг: 0 / 0
13.12.2012, 08:43
    #38076993
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите составить LINQ запрос
csharp-noobpation,

Принимается! задал вопрос в другой ветке по поводу оптимизации запроса, у самого знаний не хватаети мысли закончились. Просто хотелось средствами C# с помощью LINQ написать проверку уникальности, в принципе можно сделать и процедурой, но это не айс, как я понимаю, в свете последних рекомендаций....

что запрос должен возвращать?
...
Рейтинг: 0 / 0
13.12.2012, 08:43
    #38076994
csharp-noob
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите составить LINQ запрос
csharp-noob,
Вот тут в сосоедней теме помогли оптимизировать запрос, с моей точки зрения все стало намного хуже в плане написания LINQ.
Код: sql
1.
2.
select top 1 with ties * from @t 
order by row_number() over ( partition by inn, inn2, date order by id )
...
Рейтинг: 0 / 0
13.12.2012, 09:01
    #38077013
csharp-noob
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите составить LINQ запрос
pation,


вот что выдает запрос

Код: sql
1.
2.
select top 1 with ties * from @t 
order by row_number() over ( partition by inn, inn2, date order by id )



3 111 222 abcdeg 2011-01-02 00:00:00.000
4 111 222 abcdeg1 2011-01-03 00:00:00.000
5 333 4444 dddbcdeg1 2011-01-01 00:00:00.000
6 333 4444 fdddbcdeg1 2011-01-02 00:00:00.000
1 111 222 abcd 2011-01-01 00:00:00.000
8 333 4444 fdddbcdeg1 2011-01-03 00:00:00.000


вот что выдает запрос
Код: sql
1.
select * from @t



1 111 222 abcd 2011-01-01 00:00:00.000
2 111 222 abcde 2011-01-01 00:00:00.000
3 111 222 abcdeg 2011-01-02 00:00:00.000
4 111 222 abcdeg1 2011-01-03 00:00:00.000
5 333 4444 dddbcdeg1 2011-01-01 00:00:00.000
6 333 4444 fdddbcdeg1 2011-01-02 00:00:00.000
7 333 4444 fdddbcdeg2 2011-01-02 00:00:00.000
8 333 4444 fdddbcdeg1 2011-01-03 00:00:00.000
9 333 4444 fdddbcdeg2 2011-01-03 00:00:00.000


Нужно получить то что выдает первый запрос
...
Рейтинг: 0 / 0
13.12.2012, 09:56
    #38077062
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите составить LINQ запрос
csharp-noobcsharp-noob,
Вот тут в сосоедней теме помогли оптимизировать запрос, с моей точки зрения все стало намного хуже в плане написания LINQ.
Код: sql
1.
2.
select top 1 with ties * from @t 
order by row_number() over ( partition by inn, inn2, date order by id )


Ретранслировать его в Linq нельзя, т.к. ORM не позволяет это сделать. Как вариант, обернуть это добро во вьюху, табличную функцию или хп - и вуаля.
По первому же запросу никаких проблем:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
var query =
    (
        from t in db.tbls
        where t.Date ==
            ((from t1 in db.tbls
            where t.Inn == t1.Inn && t.Inn2 == t1.Inn2 && t.Date == t1.Date
            group t1 by new { t1.Date, t1.Inn, t1.Inn2 } into g
            where g.Count(p => p.Date != null) > 1
            select new
            {
                g.Key.Date
            }).First().Date) && t.Id == db.tbls.Where(tt => t.Date == tt.Date && t.Inn == tt.Inn && t.Inn2 == tt.Inn2).Select(d => d.Id).Min()
        select new { t }
    ).Union
    (
        from t in db.tbls
        where t.Date ==
            ((from t1 in db.tbls
            where t.Inn == t1.Inn && t.Inn2 == t1.Inn2 && t.Date == t1.Date
            group t1 by new { t1.Date, t1.Inn, t1.Inn2 } into g
            where g.Count(p => p.Date != null) == 1
            select new { g.Key.Date }).First().Date)
        select new { t }
    );
...
Рейтинг: 0 / 0
14.12.2012, 04:46
    #38078790
csharp-noob
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите составить LINQ запрос
МСУ,

Спасибо огромное!
...
Рейтинг: 0 / 0
14.12.2012, 18:30
    #38079953
pation
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите составить LINQ запрос
csharp-noobpation,


вот что выдает запрос

Код: sql
1.
2.
select top 1 with ties * from @t 
order by row_number() over ( partition by inn, inn2, date order by id )




3 111 222 abcdeg 2011-01-02 00:00:00.000
4 111 222 abcdeg1 2011-01-03 00:00:00.000
5 333 4444 dddbcdeg1 2011-01-01 00:00:00.000
6 333 4444 fdddbcdeg1 2011-01-02 00:00:00.000
1 111 222 abcd 2011-01-01 00:00:00.000
8 333 4444 fdddbcdeg1 2011-01-03 00:00:00.000


вот что выдает запрос
Код: sql
1.
select * from @t




1 111 222 abcd 2011-01-01 00:00:00.000
2 111 222 abcde 2011-01-01 00:00:00.000
3 111 222 abcdeg 2011-01-02 00:00:00.000
4 111 222 abcdeg1 2011-01-03 00:00:00.000
5 333 4444 dddbcdeg1 2011-01-01 00:00:00.000
6 333 4444 fdddbcdeg1 2011-01-02 00:00:00.000
7 333 4444 fdddbcdeg2 2011-01-02 00:00:00.000
8 333 4444 fdddbcdeg1 2011-01-03 00:00:00.000
9 333 4444 fdddbcdeg2 2011-01-03 00:00:00.000


Нужно получить то что выдает первый запрос

а если так?
select *
from @t
where id =
(
select min(id)
from @t
group by
inn, inn2, date
)
...
Рейтинг: 0 / 0
15.12.2012, 14:19
    #38080528
csharp-noob
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите составить LINQ запрос
pation,

Спасибо! Работает вот так
Код: sql
1.
2.
3.
4.
5.
6.
7.
select * from @t where id in --вместо равно  in 
(
select min(id)
from @t
group by
inn, inn2, date
) 


Гораздо короче моего!
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Помогите составить LINQ запрос / 10 сообщений из 10, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]