#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();
Комментарии:
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