Почему я не могу выбрать определенные столбцы из коллекции, используя лямбда-выражение? - PullRequest
0 голосов
/ 14 мая 2019

используя лямбда-выражение. Я просто хочу выбрать 2 столбца, но он выдает ошибку.

Код:

 public List<Certificates> GetClientsList(string certificationNo = "")
        {
            List<Certificates> certificatesList = new List<Certificates>();
            var query = uow.CertificatesRepository.GetQueryable().AsQueryable();
            if (!string.IsNullOrEmpty(certificationNo))
            {
                query = query.Where(x => x.CertificationNo.Contains(certificationNo)).Select(n => new { ClientName= n.Client, ID= n.CertificatesID});
            }
            certificatesList = query.ToList();

            return certificatesList;
        }

Класс сертификатов:

public class Certificates
    {
        public int CertificatesID { get; set; }
        public string FileName { get; set; }

        [Required]
        [Display(Name = "Certification No")]
        public string CertificationNo { get; set; }

        [Required]
        [Display(Name = "Issue Date")]
        public string IssueDate { get; set; }

        [Required]
        public string Details { get; set; }

        [Required]
        public string Client { get; set; }
    }

Ошибка:

Невозможно преобразовать анонимный тип данных в список

Ответы [ 3 ]

0 голосов
/ 14 мая 2019

Зачем вам сначала конвертировать в Queryable?какой тип возвращает uow.CertificatesRepository.GetQueryable ()?

public List<Certificates> GetClientsList(string certificationNo = "")
        {
            var query = uow.CertificatesRepository.GetQueryable(); // do ToList here if it is IQuerable, but as it seems it was not.

            return query.Where(x=>x.CertificationNo.Contains(certificationNo)).Select(x=> new Certificates(){ClientName= n.Client, ID= n.CertificatesID}).ToList();
        }
0 голосов
/ 14 мая 2019

Ваш Select возвращает анонимные объекты.Эти анонимные объекты, конечно, не могут быть преобразованы в Сертификаты.

Если вы действительно хотите использовать свой класс Сертификаты, то вы можете просто создать новые объекты в своем выборе:

public List<Certificates> GetClientsList(string certificationNo = "")
{
   List<Certificates> certificatesList = new List<Certificates>();
   var query = uow.CertificatesRepository.GetQueryable().AsQueryable();
   if (!string.IsNullOrEmpty(certificationNo))
   {
       query = query.Where(x => x.CertificationNo.Contains(certificationNo)).Select(n => new Certificates{ Client = n.Client, CertificatesID = n.CertificatesID});
   }
   certificatesList = query.ToList();
   return certificatesList;
}

AЛучшим решением, вероятно, будет создание нового класса, который содержит только два обязательных свойства.

Третья возможность - вместо этого вернуть List<dynamic>.Но тогда вы уже не печатаете строго.

0 голосов
/ 14 мая 2019

Вы, вероятно, ищете что-то подобное (в зависимости от типа возврата CertificatesRepository)

public List<Certificates> GetClientsList(string certificationNo = "")
{
   var query = uow.CertificatesRepository;

   if (string.IsNullOrEmpty(certificationNo))
      return query.ToList();

   return query.Where(x => x.CertificationNo.Contains(certificationNo))
               .ToList();
}

Обновление

Дело в том,хотите выбрать только 2 столбца

public List<Certificates> GetClientsList(string certificationNo = "")
{
   var query = uow.CertificatesRepository;

   if (string.IsNullOrEmpty(certificationNo))
      return query.Select(n => new Certificates { ClientName = n.Client, ID = n.CertificatesID})
                  .ToList();

   return query.Where(x => x.CertificationNo.Contains(certificationNo))
               .Select(n => new Certificates { ClientName = n.Client, ID = n.CertificatesID})
               .ToList();
}

или

public List<(int ID , string ClientName)> GetClientsList(string certificationNo = "")
{
   var query = uow.CertificatesRepository;

   if (string.IsNullOrEmpty(certificationNo))
      return query.Select(n => (ID = n.CertificatesID, ClientName = n.Client))
                  .ToList();

   return query.Where(x => x.CertificationNo.Contains(certificationNo))
               .Select(n => (ID = n.CertificatesID, ClientName = n.Client))
               .ToList();
}
...