Member 12681421 Ответов: 1

Можно ли перевести мой SQL-запрос в LINQ?


Привет! Я новичок в LINQ C#. Можно ли перевести мой SQL-запрос в LINQ?
Кто-нибудь может мне помочь, пожалуйста?


select Max(a.CreatedDate), Max(b.ModifiedDate), Count(*) from TableA AS a join TableB AS b on a.Id = b.Id where a.UserId = 1;


a.) TableA 
- UserID (PK, int, not null, (but NOT UNIQUE))
- Id (PK,FK, unique)
- CreatedDate (not null)

b.) TableB 
- Id (PK, unique)
- ModifiedDate (null)

There is foreign key on TableA.Id -> TableB.Id
And the last condition is that TableA.UserId = 1



Мне нужно количество строк в результате этого запроса, MAX CreatedDate и MAX ModifiedDate.

Что я уже пробовал:

------------------------------------------------------------------------------------
С#
Я пытался:

var result = (from b in TabeleB
              join a in TableA on a.Id equals b.Id
              where (a.UserId == 1)
              select new { a.CreatedDate, b.ModifiedDate })
              .ToList();

var maxModifiedDate = result.Max(x=> x.ModifiedDate);
var maxCreatedDate = result.Max(x=> x.CreatedDate);
var count = result.Count();


Но мне не нужен весь список, только три значения...
Мне нужен запрос LINQ получить максимальное значение1, значение2 Макс, кол-во строк в результате

Не могли бы вы мне помочь?

Sreekanth Mothukuru

Вы пробовали инструмент LINQPad?

Member 12681421

к сожалению у меня нет возможности скачать его

[no name]

Привет, не могли бы вы прислать свой вопрос немного подробнее?

Member 12681421

Я обновил вопрос с более подробной информацией

Beginner Luck

да

Member 12681421

Не могли бы вы дать мне какой-нибудь совет? Я добавил больше деталей в свой вопрос

Beginner Luck

http://www.sqltolinq.com/ и http://www.linqpad.net / у обоих есть учебник, как это сделать

0x01AA

Опять я :)
UserID (PK, int, not null, (but NOT UNIQUE))
В случае, если вы действительно применяется главным сдерживающим фактором Prismary для ID пользователя в БД, то Идентификатор будет уникальным В случае, если этого не произошло, вы не должны описывать UserId как PK, иначе это становится очень запутанным.

Member 12681421

Я действительно применил ограничение первичного ключа для UserID в БД, но оно не уникально. вот и все.

Не берите в голову. Моя проблема заключается в том, чтобы написать запрос LINQ, который получает MAX of someValue, MAX of otherValue и Count (*) без получения всего списка (как я уже писал в вопросе)

0x01AA

Неужели как ПК в таблице?? или, может быть, только в TableUser?

Да, я пытаюсь решить этот LINQ, но я совершенно новичок в этом деле, и делаю это как отличное упражнение для меня :-)

Member 12681421

Действительно в таблице tablea :)

0x01AA

Да теперь я вижу как вы точно определяете PK в таблице :)

Так что пока у меня есть вот это:

from a in
(from a in db.TableA
where
a.UserId == 1
select new {
a.CreatedDate,
ModifiedDate = (DateTime?)a.TableB.ModifiedDate,
Dummy = "x"
})
group a by new { a.Dummy } into g
select new {
Created = (DateTime?)g.Max(p => p.CreatedDate),
Modified = (DateTime?)g.Max(p => p.ModifiedDate),
CountA = g.Count()
}


Нет-нет. Я сделал это не сам, я понизил Linqer, чтобы сделать это. Теперь я пытаюсь понять это :lol:
Я надеюсь, что это поможет

Member 12681421

большое спасибо за это!

Я также постараюсь понять его и, возможно, упростить :)

0x01AA

Я надеюсь, что это, наконец, правильно :)

from a in
(from a in TableA
join b in TableB on a.Id equals b.Id
where
a.UserId == 1
select new {
CreatedDate= a.CreatedDate,
ModifiedDate = (DateTime?)b.ModifiedDate,
Dummy = "x"
})
group a by new { a.Dummy } into g
select new {
Created = (DateTime?)g.Max(p => p.CreatedDate),
Modified = (DateTime?)g.Max(p => p.ModifiedDate),
CountA = g.Count()
}

1 Ответов

Рейтинг:
0

Maciej Los

Вы на правильном пути!

На первый взгляд, вы должны сгруппировать данные...
Видеть: Как выполнить групповые соединения (руководство по программированию на C# )[^]

var query = from a in TableA.Where(u=>u.UserId==1)
            join b in TableB on a.Id equals b.Id into grp
            select new
                {
                    MaxOfCreated = grp.Max(z=>z.CreatedDate),
                    MaxOfModified = grp.Max(x=>x.ModifiedDate),
                    Count = grp.Count()
                };


Примечание №1: я не вижу ваших данных, поэтому ... мой запрос может не соответствовать вашим требованиям...
Примечание №2: я бы предложил скачать Помощью linqpad[^], что очень полезно в процессе перевода запросов с sql на Linq. Это бесплатный инструмент ;)

Для получения более подробной информации, пожалуйста, смотрите:
101 образцы LINQ в C#[^]