为什么我无法使用 lambda 表达式从集合中选择特定列?

问题描述 投票:0回答:3

使用 lambda 表达式我只想选择 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; }
    }

错误:

无法将匿名可查询类型转换为List

c# entity-framework lambda ef-code-first
3个回答
0
投票

您可能正在寻找类似的东西(取决于

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

0
投票

您的

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

更好的解决方案可能是创建一个仅包含两个必需属性的新类。

第三种可能性是返回

List<dynamic>
。但这样你就不再是强类型的了。


-1
投票

为什么需要先将其转换为

Queryable
uow.CertificatesRepository.GetQueryable()
返回什么类型?

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();
}
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.