powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Помогите составить LINQ запрос
10 сообщений из 10, страница 1 из 1
Помогите составить LINQ запрос
    #38075225
csharp-noob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую!
Есть вот такой запрос на 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
Помогите составить LINQ запрос
    #38075605
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
csharp-noob,

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

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

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

что запрос должен возвращать?
...
Рейтинг: 0 / 0
Помогите составить LINQ запрос
    #38076994
csharp-noob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Помогите составить LINQ запрос
    #38077013
csharp-noob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Помогите составить LINQ запрос
    #38077062
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Помогите составить LINQ запрос
    #38078790
csharp-noob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
МСУ,

Спасибо огромное!
...
Рейтинг: 0 / 0
Помогите составить LINQ запрос
    #38079953
Фотография pation
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Помогите составить LINQ запрос
    #38080528
csharp-noob
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
10 сообщений из 10, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Помогите составить LINQ запрос
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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