CodingManiac
CodingManiac

Reputation: 123

Why can't I select specific columns from collection using lambda expression?

using the lambda expression I just want to select 2 columns but it throws error.

Code:

 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;
        }

Certificates class:

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; }
    }

Error:

Cannot convert Anonymous querable type to List

Upvotes: 0

Views: 664

Answers (3)

vsarunov
vsarunov

Reputation: 1547

Why do you need it converted to Queryable first? What type does uow.CertificatesRepository.GetQueryable() return?

public List<Certificates> GetClientsList(string certificationNo = "")
{
    var query = uow.CertificatesRepository.GetQueryable(); // do ToList here if it is IQueryable, 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();
}

Upvotes: -1

timnot90
timnot90

Reputation: 371

Your Select returns anonymous objects. These anonymous objects of course can't be converted to Certificates.

If you really want to use your Certificates class, then you could just create new objects in your 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 better solution would probably be to create a new class which only contains the two required properties.

A third possibility is to return a List<dynamic> instead. But then you are not strongly typed anymore.

Upvotes: 0

TheGeneral
TheGeneral

Reputation: 81473

You are probably looking for something like this (depending on the return type of 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();
}

Update

The thing is want is to select 2 columns only

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();
}

or

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();
}

Upvotes: 0

Related Questions