Вызов метода вложенного выражения в Linq.Select () - PullRequest
0 голосов
/ 27 апреля 2018

Я использую .Select(i=> new T{...}) после каждого удара по дб вручную, чтобы преобразовать мои объекты в объект DTO. Вот некоторые примеры сущностей и DTOS

Пользовательский объект;

public partial class User
{
    public int Id { get; set; }
    public string Username { get; set; }
    public virtual UserEx UserEx { get; set; }
}

Пользователь DTO;

public class UserDTO
{
    public int Id { get; set; }
    public string Username { get; set; }
}

объект UserEx;

public class UserEx
{
    public int UserId { get; set; }
    public string MyProperty1 { get; set; }
    public virtual User User { get; set; }
}

UserEx DTO;

public class UserExDTO
{
    public int MyProperty1 { get; set; }
    public UserDTO UserModel { get; set; }
}

Мои методы выражения преобразования;

public static class ConversionExpression
{
    public static Expression<Func<UserEx, UserExDTO>> GetUserExDTOConversionExpression()
    {
        return userEx => new UserExDTO
        {
            MyProperty1 = userEx.MyProperty1,
            UserModel = new UserDTO
            {
                Id = userEx.User.Id,
                Username = userEx.User.Username
            }
        };
    }

    public static Expression<Func<User, UserDTO>> GetUserDTOConversionExpression()
    {
        return user => new UserDTO
        {
            Id = user.Id,
            Username = user.Username
        };
    }
}

И мое текущее использование для UserDTO;

myContext.Users
    .Select(ConversionExpression.GetUserDTOConversionExpression())
    .ToList();

для UserExDTO;

myContext.UserExes
    .Select(ConversionExpression.GetUserExDTOConversionExpression())
    .ToList();

Прошу прощения за долгое вступление, вот мой вопрос Мне нужно сгруппировать

new UserDTO
{
    Id = userEx.User.Id,
    Username = userEx.User.Username
}

из-за одной проблемы. Поэтому я хочу что-то вроде этого;

public static Expression<Func<UserEx, UserExDTO>> GetUserExDTOConversionExpression()
{
    return userEx => new UserExDTO
    {
        MyProperty1 = userEx.MyProperty1,
        //this line does not behave like the other one 
        UserModel = userEx.User.GetUserDTOConversionExpression()
    };
}

Есть ли способ сделать это, или я должен записать каждое выражение, индивидуальное и не связанное с аналогичными потребностями?

1 Ответ

0 голосов
/ 29 июля 2018

Я решил свою проблему и не только с помощью NeinLinq. Вот мое решение; Сначала нужно удалить вложенные объявления.

public static Expression<Func<UserEx, UserExDTO>> GetUserExDTOConversionExpression()
{
    return userEx => new UserExDTO
    {
        MyProperty1 = userEx.MyProperty1
        //We removed other model declaration here.
    };
}

Затем используйте метод To NeinLinq для определения перевода;

public static Expression<Func<UserEx, UserExDTO>> GetUserExDtOCompbinedExpression()
    {
    //Translate() and To() methods do all the job
    return GetUserDTOConversionExpression().Translate()
       .To(userEx => userEx.User, userExDTO => userExDTO.UserModel, GetUserExDTOConversionExpression());
    }
...