Преобразование запроса linq в лямбда-запрос с помощью объединений

#c# #entity-framework #lambda

#c# #entity-framework #лямбда

Вопрос:

Я новичок в lambda. как я могу написать приведенный ниже код, используя лямбда. Спасибо

 User user1 = (from u in db.Users
                                  join h in db.HCM_SMS_ROLE_MAPPINGs
                                  on u.roleID equals h.SMS_Role_ID
                                  where (u.Employee_Code == employeeCode amp;amp; u.isDeleted == false amp;amp; h.Is_Active_App == true)
                                  select u).Distinct().FirstOrDefault();
  

Комментарии:

1. lq2m.azurewebsites.net

2. Я думаю, вы имели в виду от синтаксиса запроса к синтаксису метода, потому что оба будут рассмотрены LINQ

3. можете ли вы поделиться своими классами модели?

Ответ №1:

Это должно сработать для вас:

 db.Users.Join(db.HCM_SMS_ROLE_MAPPINGs, u => u.roleID, h => h.SMS_Role_ID, (u, h) => new
{
u, h
}
).Where(x=> x.u.Employee_Code == employeeCode amp;amp; x.u.isDeleted == false amp;amp; x.h.Is_Active_App == true).Select(x=> x.u).Distinct().FirstOrDefault()
  

Чистый и простой! Надеюсь, это поможет

Комментарии:

1. это правильная версия lambda для синтаксиса запроса в вопросе, хотя, пожалуйста, помните, что Distinct для работы с полным объектом либо передает IEqualityComparer , либо реализует IEquatable

2. @MrinalKamboj не могли бы вы предложить правку, объясняющую это? Я не понимаю, как это сделать правильно.

3. это перегрузка идентификатора, который может быть предоставлен IEqualityComparer , или класс должен реализовать IEquatable , поэтому, когда класс не реализует IEquatable , тогда мы переходим к внешнему IEqualityComparer , это точки, которые помогают в решении проблем в объекте класса, выполняющем сравнение равенства, иначе это идет для сравнения ссылок вместо сравнения значений / свойств, которое мы обычно ожидаем для примитивных типов

4. @MrinalKamboj похоже ли это на то, что я делаю класс наследуемым от IEqualityComparer типа ClassToBeCompared и добавляю метод, равный ему? вот так: class Compare : IEqualityComparer<ClassToBeCompared> { public bool Equals(ClassToBeCompared x, ClassToBeCompared y) { return x.Numf == y.Numf; } }

5. да, вы можете использовать IEqualityComparer производный класс, если класс не реализуется IEquatable по умолчанию, идея состоит в том, чтобы выполнить сравнение значений для ссылочных типов, которые в противном случае могли бы проверять равенство ссылок по умолчанию

Ответ №2:

Мой метод заключается в том, чтобы щелкнуть правой кнопкой мыши лампочку в левой боковой панели и выбрать «Преобразовать LINQ в цепочку методов», что дает следующее:

 User user1 = (db.Users
                .Join(db.HCM_SMS_ROLE_MAPPINGs, 
                   u => u.roleID, 
                   h => h.SMS_Role_ID, 
                   (u, h) => new { u, h })
                .Where(@t => (u.Employee_Code == employeeCode amp;amp; u.isDeleted == false amp;amp; h.Is_Active_App == true))
                .Select(@t => u))
                .Distinct()
                .FirstOrDefault();
  

Я думаю, что это функция Resharper.

Комментарии:

1. замечательно, хотя вы можете добавить объяснение, не у всех будет Resharper