Получить первый и последний элемент коллекции одновременно - PullRequest
0 голосов
/ 29 апреля 2019

Я сейчас работаю над кроссплатформенным проектом.

Я сталкиваюсь с проблемой при попытке сопоставить модель между WebDataLayer.Models и Shared.Models.

namespace WebDataLayer.Models
{
    public class Factory
    {
        public Guid Id { get; set; }
        public string Name { get; set; }

        public string Serie { get; set; }

        public Guid? AreaId { get; set; }

        public virtual ICollection<FactoryHotline> FactoryHotlines { get; set; }
}

public class FactoryHotline
    {
        public Guid Id { get; set; }
        public Guid FactoryId { get; set; }

        [Required]
        [MaxLength(256)]
        public string Caption { get; set; }

        [Required]
        [MaxLength(256)]
        public string Hotline { get; set; }
    }

Это модель в разделе:

namespace Shared.Models
{
    [DataContract]
    public class Factory
    {
        [DataMember(Name = "id")]
        public Guid Id { get; set; }

        [DataMember(Name = "areaId")]
        public Guid AreaId { get; set; }

        [DataMember(Name = "name")]
        public string Name { get; set; }

        [DataMember(Name = "serie")]
        public string Serie { get; set; }

        [DataMember(Name = "hotLine1")]
        public FactoryHotline Hotline1 { get; set; }

        [DataMember(Name = "hotLine2")]
        public FactoryHotline Hotline2 { get; set; }
    }

public class FactoryHotline
    {
        [DataMember(IsRequired = true, Name = "Id")]
        public Guid Id { get; set; }

        [DataMember(Name = "FactoryId")]
        public Guid FactoryId { get; set; }

        [DataMember(Name = "Caption")]
        public string Caption { get; set; }

        [DataMember(Name = "Hotline")]
        public string Hotline { get; set; }
    }
}

Это код в контроллере, где я пытаюсь преобразовать WebDatalayer.Models.Factory в Shared.Models.Factory:

public ActionResult Edit()
        {
            var factories = _factoryService.All().OrderBy(p => p.Name);
            List<Shared.Models.Factory> response = new List<Shared.Models.Factory>();

            response =  factories.Select(k => new Shared.Models.Factory
             {
                 Id = k.Id,
                 Name = k.Name,
                 Serie = k.Serie,
                 Hotline1 = new Shared.Models.FactoryHotline {
                     Id = k.FactoryHotlines.FirstOrDefault().Id,
                     Caption = k.FactoryHotlines.FirstOrDefault().Caption,
                     Hotline = k.FactoryHotlines.FirstOrDefault().Hotline,
                     FactoryId = k.FactoryHotlines.FirstOrDefault().FactoryId
                 },
                 Hotline2 = new Shared.Models.FactoryHotline
                 {
                     Id = k.FactoryHotlines.LastOrDefault().Id,
                     Caption = k.FactoryHotlines.LastOrDefault().Caption,
                     Hotline = k.FactoryHotlines.LastOrDefault().Hotline,
                     FactoryId = k.FactoryHotlines.LastOrDefault().FactoryId
                 },
            }).OrderBy(f => f.Name).ToList();
            return View("Edit", response);
        }

Но linq to entities does not recognize the method lastordefault, не могу использовать order descending, потому что я также получаю первый элемент одновременно.

Нужна помощь!

Ответы [ 2 ]

1 голос
/ 29 апреля 2019

Похоже, вы хотите вернуть все фабрики, упорядоченные по названию, и для каждой фабрики вернуть первую и последнюю горячую линию:

var query = factories.Select(f => new Shared.Models.Factory
    {
        Id = f.Id, 
        Name = f.Name,
        Serie = f.Serie,
        Hotline1 = f.FactoryHotLines
            .OrderBy(h => h.Id)
            .Select(h => new Shared.Models.FactoryHotline 
            {
                Id = h.Id,
                Caption = h.Caption,
                Hotline = h.Hotline,
                FactoryId = h.FactoryId
            }).FirstOrDefault(),
        Hotline2 = x.FactoryHotLines
            .OrderByDescending(h => h.Id)
            .Select(h => new Shared.Models.FactoryHotline 
            {
                Id = h.Id,
                Caption = h.Caption,
                Hotline = h.Hotline,
                FactoryId = h.FactoryId
            }).FirstOrDefault(),
     }).OrderBy(f => f.Name)
     .ToList();

Ключевой момент: при использовании FirstOrDefault() всегда указывайтеOrderBy пункт.Вместо того, чтобы полагаться на FirstOrDefault() для получения каждого отдельного значения, используйте его с OrderBy() для получения сущности, затем используйте Select(), чтобы уменьшить его до требуемой модели представления.

В приведенном выше примере предполагается, что выхотите, чтобы они были добавлены.(Идентификатор для записей, основанных на идентификации). Таким образом, мы делаем OrderBy(), чтобы получить первую горячую линию, а затем OrderByDescending(), чтобы получить вторую.

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

Я не уверен, что это самое чистое решение, но вы можете связать .Where следующим образом:

.Where((v, i) => { return i == 0 || i == list.Count() -1; })

Так ..

factories = factories.Where((v, i) => { return i == 0 || i == factories.Count() -1; })
...