Спасибо за вашу помощь, ребята, я вас всех проголосовал, но вы не поверите, но несколько часов спустя я искал программу для преобразования SQL в LINQ, и, к моему удивлению, нашел программу под названием " Linqer ». Звучит безумно и не ожидал, что уйду далеко, но это сработало отлично ... определенно стоит проверить это приложение, если кто-то застрянет в той же лодке ...
Проверьте гигантский запрос, который он возвратил! Проанализировав это, не думайте, что это лишнее раздувание? У кого-нибудь есть какие-либо советы по оптимизации или обнаружен какой-либо ненужный код?
moduleDeviceStates = from ulh in user.UserLoginHistories
join ulcch in userLogin.UserLoginClientConnectionHistories on new { ID = ulh.ID } equals new { ID = ulcch.UserLoginHistoryID }
join cm in clientModuleRepository.GetAll(GenericStatus.Active) on new { ClientModuleID = ulcch.ClientModuleID } equals new { ClientModuleID = cm.ID }
join mo in moduleRepository.GetAll(GenericStatus.Active) on new { ModuleID = cm.ModuleID } equals new { ModuleID = mo.ID }
join m in
(
(from ulcch1 in userLogin.UserLoginClientConnectionHistories
group ulcch1 by new
{
ulcch1.UserLoginHistoryID
} into g
select new
{
maxCreatedAt = g.Max(p => p.CreatedAt)
})) on new { maxCreatedAt = ulcch.CreatedAt } equals new { maxCreatedAt = m.maxCreatedAt }
select new ModuleDeviceState()
{
ModuleID = mo.ID,
Name = mo.Name,
DeviceState = (State.DeviceState)ulcch.DeviceState,
CreatedAt = ulcch.CreatedAt
};
Приветствую вас за помощь, dahlbyk, но я действительно хотел сгруппировать по UserLoginHistoryID, мой запрос был подтвержден в SQL, прежде чем углубляться в лямбда-эквивалент :) спасибо.
@Mark Спасибо, что нашли время ответить, да, я делаю то, что [последние] записи для пользователя (userloginhistory .. который, в свою очередь, содержит идентификатор пользователя) для каждого дня, и экспорт моего sql в запрос linq действительно дал то, что я хотел ( что можно увидеть в результате запроса ниже, это то, что я хочу. Причина, по которой вы видите двойные записи для каждого дня, заключается в том, что к нему также прикреплены модули ClientModule .. поэтому я действительно хочу, чтобы все клиентские модули на каждую запись для входа в день - так сложно чтобы получить требования к программированию через дискуссионный форум, аааа!) Возможно, ваш делает то же самое (кажется, если я правильно читаю ваш вывод) просто намного более упорядоченным.
Понимаете, я не слишком много знал о том, как вы кастовали анон с GroupBy
и Select
, но теперь я вижу это, это имеет смысл. Я могу попробовать. Надеюсь, я смогу также настроить различные модули ClientModule на день. Так или иначе .. вот результат запроса от моего SQL, и фактически то, что я получил через свою собственную лямбду:
ID UserLoginHistoryID StatusID ClientModuleID DeviceState UpdatedAt CreatedAt
277 62 1 1 4 NULL 2009-10-31 13:28:59.003
278 62 1 16 4 NULL 2009-10-31 13:28:59.003
331 65 1 1 4 NULL 2009-10-31 17:13:28.333
332 65 1 16 4 NULL 2009-10-31 17:13:28.333
Марк обновления: Привет еще раз, через пару настроек вашего запроса я мог бы создать один и тот же граф объектов в .NET между обоими лямбда-операторами. Это то, что я буду использовать сейчас, полученное от вашего, так как оно более упорядочено и легче для понимания, чем у auto-gen'd, и я начислю вам очки:)
Я добавил еще несколько записей в Группу, поскольку мне это нужно для моего new
ModuleDeviceState
класса.
moduleDeviceStates = userLogin.UserLoginClientConnectionHistories
.GroupBy(y => new { Id = y.UserLoginHistoryID,
CreatedAt = y.CreatedAt.Date,
ModuleID = y.ClientModule.ModuleID,
ModuleName = y.ClientModule.Module.Name,
DeviceState = y.DeviceState })
.Select(x => new ModuleDeviceState()
{
ModuleID = x.Key.ModuleID,
Name = x.Key.ModuleName,
DeviceState = (State.DeviceState)x.Key.DeviceState,
CreatedAt = x.Max(y => y.CreatedAt)
});