Linq - объединение двух операторов, использующих один и тот же метод - PullRequest
0 голосов
/ 30 апреля 2019

Я пытаюсь переписать и интегрировать следующий код в один оператор:

Так что вместо того, чтобы делать это:

     var dbList = await _context.ProfileSections.Select(p => new
        {
            p.Id,
            p.Description,
            p.InformationText
        }).ToListAsync();

        var localisedList = dbList.Select(p => new
        {
            p.Id,
            Description = p.Description.Translate(),
            Information = p.InformationText.Translate()
        }).ToList();

Полагаю, я мог бы использовать, если я строго наберу модель и использую foreach, что-то вроде:

 var dbList = await _context.ProfileSections.Select(p => new ProfileSectionModel
        {
            p.Id,
            p.Description,
            p.InformationText
        }).ToListAsync();

        var localisedList = dbList.ForEach(l => {
            l.Description = l.Description.Translate();
            l.InformationText = l.InformationText.Translate();
        }).ToList();

Однако, затем получите сообщение об ошибке: Operator '.' cannot be applied to operand of type 'void'

Так проще ли объединить два утверждения? Или я всегда буду возвращать анонимный тип. Не знаете, как правильно справиться с этим?

EDIT

Может использовать следующее, но затем возникла проблема с динамическими прокси, которые использует EF. Я думаю, поэтому его выбор в анонимный тип?

    var dbList = await _context.ProfileSections.ToListAsync();

    foreach (var item in dbList)
    {
        item.Description = item.Description.Translate(),
        item.Information = item.InformationText.Translate()
    }

Ответы [ 3 ]

0 голосов
/ 30 апреля 2019

Используйте присоединение, как это:

    class Program
    {
        static void Main(string[] args)
        {
            DataBase _context = new DataBase();

            List<ProfileSections> localisedList = new List<ProfileSections>();

            var results = localisedList  
                           .Select(p => new
                           {
                               Id = p.Id,
                               Description = p.Description,
                               InformationText = p.InformationText,
                               TranslateDescription = p.TranslateDescription,
                               TranslateInformationText = p.TranslateInformationText
                           }).ToList();
        }
    }
    public class DataBase
    {
        public List<ProfileSections> ProfileSections { get; set; }
    }
    public class ProfileSections
    {
        public int Id { get; set; }
        public string Description { get; set; }
        public string InformationText { get; set; }

        public string TranslateInformationText
        {
            get { return TranslateFunction(InformationText); }
            set { ;}
        }

        public string TranslateDescription
        {
            get { return TranslateFunction(Description); }
            set { ;}
        }

        private string TranslateFunction(string s)
        {
            return s;
        }
    }
0 голосов
/ 30 апреля 2019

Поскольку ваш метод перевода не работает в запросе LINQ, foreach действительно может быть полезным.Попробуйте вот так:

void Main()
{
    var listOne = new List<dings>{
        new dings() {id = 1, name = "aaa"},
        new dings() {id = 2, name = "bbb"},
        new dings() {id = 3, name = "ccc"},
    };

    var listTwo = new List<bums>();
    foreach (var item in listOne)
    {
        listTwo.Add(
        new bums()
            {
                idbums = item.id + 33,
                namebums = item.name + "hoho"
            }
        );
    }
}

public class dings
{
    public int id;
    public string name;
}

public class bums
{
    public int idbums;
    public string namebums;
}
0 голосов
/ 30 апреля 2019

Не использовать ForEach вообще.Вы можете сделать это за один раз в операторе выбора LINQ.Что касается вашей ошибки: я полагаю, она исходит от dbList.ForEach, что является неправильным использованием.

void Main()
{
    var listOne = new List<dings>{
        new dings() {id = 1, name = "aaa"},
        new dings() {id = 2, name = "bbb"},
        new dings() {id = 3, name = "ccc"},
    };

    var listTwo = listOne.Select(x => new bums() 
        {
            idbums = x.id + 33, 
            namebums = x.name + "hoho"
        }
    ).ToList();
}

public class dings{
    public int id;
    public string name;
}

public class bums
{
    public int idbums;
    public string namebums;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...