C# лямбда-значение null условное - PullRequest
0 голосов
/ 14 июля 2020

У меня следующий DTO:

public class DTO_UserWithCreds
{
    public string Name { get; set; }

    public string Surname { get; set; }
    public string Ava1 { get; set; }
    public UserType Type { get; set; }
    public string Uid { get; set; }

    public DateTime? BanDateTime { get; set; }
    
    };

И я получаю пользователей из базы данных следующим образом:

  var users = from vkuser in _context.VkUsers
                join contextUser in _context.Users on vkuser.Uid equals contextUser.Uid
                join userClaim in _context.UserClaims on contextUser.Id equals userClaim.UserId
                let userBanOffset = contextUser.LockoutEnd
                let userBan = userBanOffset.HasValue ? userBanOffset.Value.Date : null
                select new DTO_UserWithCreds
                { 
                    Name = vkuser.Name,
                    Surname = vkuser.Surname,
                    Ava1 = vkuser.Ava1,
                    Uid = vkuser.Uid,
                    Type =  DTO_UserWithCreds.FromString(userClaim.ClaimValue),
                    BanDateTime = userBan
                };
       

Я получаю следующее сообщение об ошибке (я не совсем понимаю, если честно) : ошибка des c

Если я изменю запрос на это:

  var users = from vkuser in _context.VkUsers
                join contextUser in _context.Users on vkuser.Uid equals contextUser.Uid
                join userClaim in _context.UserClaims on contextUser.Id equals userClaim.UserId
                let userBanOffset = contextUser.LockoutEnd
               // let userBan = userBanOffset.HasValue ? userBanOffset.Value.Date : null
                select new DTO_UserWithCreds
                { 
                    Name = vkuser.Name,
                    Surname = vkuser.Surname,
                    Ava1 = vkuser.Ava1,
                    Uid = vkuser.Uid,
                    Type =  DTO_UserWithCreds.FromString(userClaim.ClaimValue),
                    BanDateTime = contextUser.LockoutEnd?.DateTime 
                };

, у меня будет ошибка компиляции, что лямбда внутри дерева выражений не может содержать нулевой оператор распространения. Можно ли получить эту информацию так, как я хочу? Или мне нужно написать второй запрос?

Ответы [ 4 ]

2 голосов
/ 14 июля 2020

Вы только что пропустили кастинг:

  var users = from vkuser in _context.VkUsers
                join contextUser in _context.Users on vkuser.Uid equals contextUser.Uid
                join userClaim in _context.UserClaims on contextUser.Id equals userClaim.UserId
                let userBanOffset = contextUser.LockoutEnd
                let userBan = userBanOffset.HasValue ? userBanOffset.Value.Date : (DateTime?)null
                select new DTO_UserWithCreds
                { 
                    Name = vkuser.Name,
                    Surname = vkuser.Surname,
                    Ava1 = vkuser.Ava1,
                    Uid = vkuser.Uid,
                    Type =  DTO_UserWithCreds.FromString(userClaim.ClaimValue),
                    BanDateTime = userBan
                };
2 голосов
/ 14 июля 2020

Вы можете преобразовать null в DateTime?:

let userBan = userBanOffset.HasValue ? userBanOffset.Value.Date : (DateTime?)null
1 голос
/ 14 июля 2020

Ваша проблема здесь:

let userBan = userBanOffset.HasValue ? userBanOffset.Value.Date : null

Какой тип userBan? Как компилятор должен это понять? userBanOffset.Value.Date - это DateTime, но null не является и не может быть DateTime, потому что DateTime - это тип значения, а типы значений не могут быть нулевыми.

Итак, чтобы решить эту проблему проблема, вам нужно сказать , что null - это Nullable<DateTime>, чтобы разрешить неоднозначность:

let userBan = userBanOffset.HasValue ? userBanOffset.Value.Date : (DateTime?)null

Вы также можете сделать:

let userBan = userBanOffset.HasValue ? (DateTime?)userBanOffset.Value.Date : null

Но лично я всегда использую первое. Зависит от того, что, по вашему мнению, более читабельно.

0 голосов
/ 14 июля 2020

Измените

BanDateTime = contextUser.LockoutEnd?.DateTime

на

BanDateTime = (contextUser.LockoutEnd == null) ? null : contextUser.LockoutEnd.DateTime
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...