【问题标题】:Cannot implicitly convert type 'System.Linq.IQueryable<Anon>to 'System.Linq.IQueryable<Report>An explicit conversion exists,are you missing a cast?无法将类型 'System.Linq.IQueryable<Anon> 隐式转换为 'System.Linq.IQueryable<Report>存在显式转换,您是否缺少演员表?
【发布时间】:2014-11-29 17:25:45
【问题描述】:

如何从表格中选择特定的列?我试试这个显示错误 无法将类型“System.Linq.IQueryable”隐式转换为“System.Linq.IQueryable”。存在显式转换,您是否缺少演员表?

var query = myRepository.Query().AsQueryable();

query = query.Select(f =>
                        new
                        {
                            f.Name,
                            f.Email,
                            f.Message,
                            f.Succeeded,
                            f.ExecutedOn,
                            f.CreatedOn,
                            f.DeletedOn
                        }).Where(file => file.DeletedOn == null).OrderByDescending(f => f.CreatedOn);

return query.ToList();

但是当我尝试这个时它可以工作,

if (!String.IsNullOrEmpty(searchModel.Name))
          {
              query = query.Where(f =>f.Name.Contains(searchModel.Name));
          }
 query = query.Where(file => file.DeletedOn == null).OrderByDescending(file => file.CreatedOn); 

【问题讨论】:

  • 您的问题是什么?没有关于你想要什么的细节。请提供更多详细信息,以便有人可以帮助您

标签: .net linq


【解决方案1】:

您的第一个查询是生成一个匿名类型。如果您想要 Report 对象的列表,那么您的 Select 调用中的 Lambda 必须创建一个 Report 对象,即:

f =>
                        new
                        {
                            f.Name,
                            f.Email,
                            f.Message,
                            f.Succeeded,
                            f.ExecutedOn,
                            f.CreatedOn,
                            f.DeletedOn
                        }

应该是这样的:

f =>
                        new Report
                        {
                            f.Name,
                            f.Email,
                            f.Message,
                            f.Succeeded,
                            f.ExecutedOn,
                            f.CreatedOn,
                            f.DeletedOn
                        }

【讨论】:

    【解决方案2】:

    创建新的 Class 对象然后使用它

    var result = from mr in myRepository
                         where mr.DeletedOn == null
                         orderby mr.CreatedOn descending
                         select new NewRepository
                         {
                              mr.Name,
                        mr.Email,
                        mr.Message,
                        mr.Succeeded,
                        mr.ExecutedOn,
                        mr.CreatedOn,
                       mr.DeletedOn
                         };
    

    如果您有任何错误,请告诉我您的 myRepository DataType

    【讨论】:

      【解决方案3】:

      你已经初始化了IQueryable&lt;Query&gt;类型的查询,但后来分配了IOrderedQueryable&lt;AnonymousType&gt;类型的值,因为这两种类型不匹配,会导致编译时错误。这里的问题在于内部类型(QueryAnonymousType)。请按以下方式修改您的查询。

      var query = myRepository.Query().AsQueryable()
                      .Select(f =>
                          new
                          {
                              f.Name,
                              f.Email,
                              f.Message,
                              f.Succeeded,
                              f.ExecutedOn,
                              f.CreatedOn,
                              f.DeletedOn
                          }).Where(file => file.DeletedOn == null).OrderByDescending(f => f.CreatedOn);
      
      return query.ToList();
      

      【讨论】:

      • 这是不正确的。 IOrderedQueryable&lt;T&gt; 继承 IQueryable&lt;T&gt; 因此将前者的实例分配给后者类型的变量没有问题。它不会反过来工作,但这不是问题。查看标题中的错误信息;区别在于IQueryable 的泛型类型。
      • 请查看我编辑的答案,之前我也提到过相同的内容,但由于 html 中的 符号行为,它没有显示在我的答案中,并且内部类型,即 Anon 和 Report 没有在问题中提及回答的时间。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-10
      • 1970-01-01
      相关资源
      最近更新 更多