【问题标题】:Cannot implicitly convert type 'System.Linq.IQueryable<Model>' to 'Model'无法将类型“System.Linq.IQueryable<Model>”隐式转换为“Model”
【发布时间】:2015-08-04 13:33:46
【问题描述】:

我有一个操作结果,用于从我的视图模型中填充一个 IQueryable 字段和一个 IEnumerable 字段。我可以填充其中一个,但不能同时填充两个,因为我遇到了这个错误。我需要填充这两个字段,然后将它们传递给视图。谁能帮我解决这个错误?

查看模型:

 public class AdminReviewViewModel {
    public IEnumerable<Review> Reviews { get; set; }
    public IQueryable Clients { get; set; }

    public int ClientID { get; set; }
    public int ReviewID {get; set;}
    public string ReviewName { get; set; }
    public int? ReviewPeriodID { get; set; }
    public string ReviewPeriodName { get; set; }
}

控制器:

 public ActionResult Review() {
            AdminReviewViewModel model = new AdminReviewViewModel();

            model.Clients = clientRepo.Clients;

            var reviews = reviewRepo.GetAllReviews();


            model = reviews.Select(s => new AdminReviewViewModel() {
                ClientID = s.ClientID,
                ReviewID = s.ReviewID,
                ReviewName = s.ReviewName,
                ReviewPeriodID = s.ReviewPeriodID,
                ReviewPeriodName = s.ReviewPeriod,
            });

            return View(model);
        }

查看:

<div class="table table-responsive" id="TablePanel">
        <table class="table table-bordered"id="data">
            <thead class="TableHead">
                <tr>
                    <td>
                        Client ID
                    </td>
                    <td>
                        Review ID
                    </td>
                    <td>
                        Review Name
                    </td>
                    <td>
                        Review Period ID
                    </td>
                    <td>
                        Review Period Name
                    </td>
                    <td></td>
                </tr>
            </thead>
            @foreach (var item in Model) {
                <tr>
                    <td>
                        @Html.DisplayFor(modelItem => item.ClientID)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.ReviewID)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.ReviewName)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.ReviewPeriodID)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.ReviewPeriodName)
                    </td>
                    <td>
                        Edit
                    </td>
                </tr>
            }
        </table>
    </div>

【问题讨论】:

  • 这不是相关代码,请显示您在哪里使用Model
  • 你从哪里得到异常(在哪一行)?
  • @HamletHakobyan 我在这一行收到异常:model = model.Reviews.Select(s => new AdminReviewViewModel() {
  • @AndrewKilburn 您收到异常是因为您尝试使用来自您的 linq 语句的 IEnumerable&lt;AdminReviewViewModel&gt; 覆盖类型为 AdminReviewViewModel 的变量。
  • @HamletHakobyan 不幸的是,仍然没有快乐

标签: c#


【解决方案1】:
model = reviews.Select(s => new AdminReviewViewModel() {
            ClientID = s.ClientID,
            ReviewID = s.ReviewID,
            ReviewName = s.ReviewName,
            ReviewPeriodID = s.ReviewPeriodID,
            ReviewPeriodName = s.ReviewPeriod,
        });

表示“使model 成为调用Select 的结果”。由于model 已被定义为单个AdminReviewViewModel,这没有任何意义。

您可能希望它更像:

public class AdminReviewViewModel
{
  public int ClientID { get; set; }
  public int ReviewID {get; set;}
  public string ReviewName { get; set; }
  public int? ReviewPeriodID { get; set; }
  public string ReviewPeriodName { get; set; }
}
public class AdminReviewListViewModel
{
  public IEnumerable<Review> Reviews { get; set; } // Don't know what this is for, but leaving it.
  public IQueryable Clients { get; set; }
  public IQueryable<AdminReviewViewModel> ReviewList { get; set; }
}
public ActionResult Review()
{
  AdminReviewListViewModel model = new AdminReviewListViewModel();
  model.Clients = clientRepo.Clients;
  var reviews = reviewRepo.GetAllReviews();
  model.ReviewList = reviews.Select(s => new AdminReviewViewModel() {
    ClientID = s.ClientID,
    ReviewID = s.ReviewID,
    ReviewName = s.ReviewName,
    ReviewPeriodID = s.ReviewPeriodID,
    ReviewPeriodName = s.ReviewPeriod,
    });
  return View(model);
}

那么您就有了一个模型,其中包含您选择的结果。

【讨论】:

  • 为什么Review 的类型是IEnumerable&lt;Review&gt; 而不是IEnumerable&lt;AdminReviewViewModel&gt;
  • 因为评论是一个独立的实体。
  • 哦。我有你想做的事。
  • 尽管我感谢您愿意提供帮助。它仍然返回相同的错误,我现在要将 Clients 放入 ViewBag 并将它们放入选择列表中,然后将评论作为列表返回。谢谢
【解决方案2】:

我认为您的 reviews 是某种类型的 IEnumerable&lt;&gt; 并且您可以使用 linq 选择 IEnumerable&lt;AdminReviewViewModel&gt;

        model = reviews.Select(s => new AdminReviewViewModel() {
            ClientID = s.ClientID,
            ReviewID = s.ReviewID,
            ReviewName = s.ReviewName,
            ReviewPeriodID = s.ReviewPeriodID,
            ReviewPeriodName = s.ReviewPeriod,
        }).FirstOrDefault();

如果您只需要第一个元素,或者您必须将模型的类型更改为IEnumerable&lt;AdminReviewViewModel&gt;

更新

public ActionResult Review() {

    var reviews = reviewRepo.GetAllReviews();

    var models = reviews.Select(s => new AdminReviewViewModel() {
        ClientID = s.ClientID,
        ReviewID = s.ReviewID,
        ReviewName = s.ReviewName,
        ReviewPeriodID = s.ReviewPeriodID,
        ReviewPeriodName = s.ReviewPeriod,
        Clients = clientRepo.Clients
    });

    return View(models);
}

【讨论】:

  • 他在调用“获取所有评论”的方法,你为什么认为他只是想获得一条评论?
  • 因为AdminReviewViewModel model = new AdminReviewViewModel();
  • @take 嗨,我不想返回一条评论。尝试返回许多结果时,我已多次调用模型线
  • @take 感谢更新的答案。但是,我现在只能返回评论而不是客户。我之前已经这样做了
  • 客户在模型中 (Clients = clientRepo.Clients?)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-24
  • 2018-10-29
  • 2011-03-25
  • 1970-01-01
相关资源
最近更新 更多