【问题标题】:The entity or complex type 'OdeToFood.Models.RestaurantListViewModel' cannot be constructed in a LINQ to Entities query无法在 LINQ to Entities 查询中构造实体或复杂类型“OdeToFood.Models.RestaurantListViewModel”
【发布时间】:2015-02-06 04:51:06
【问题描述】:

作为 Multiplesight 提供的 OdeToFood 培训包的一部分。

错误信息:

“System.NotSupportedException”类型的异常发生在 EntityFramework.SqlServer.dll 但未在用户代码中处理

附加信息:实体或复杂类型 'OdeToFood.Models.RestaurantListViewModel' 不能在 LINQ to Entities 查询。

错误来自(_Restaurant.cshtml):

@model IEnumerable<OdeToFood.Models.RestaurantListViewModel>

<div id="restaurantList">
    @foreach (var item in Model)
    {
        <div>
            <h4>@item.Name</h4>
            <div>
            @item.City, @item.Country
            </div>
            <div> 
            Reviews: @item.CountOfReviews
            </div>
            <hr /> 
        </div>

    }
</div>

Index.cshtml

@model IEnumerable<OdeToFood.Models.RestaurantListViewModel>

    @{
        ViewBag.Title = "Home Page";
    }



<form method="get" action="@Url.Action("Index")"
    data-otf-ajax="true" data-otf-target="#restaurantList">

    <input type="search" name="searchTerm" />
    <input type="submit" value="Search By Name" />

</form>
@Html.Partial("_Restaurants", Model)

HomeController.cs

using OdeToFood.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Data.Entity;
using System.Web;
using System.Web.Mvc;

namespace OdeToFood.Controllers
{
    public class HomeController : Controller
    {
        OdeToFoodDb _db = new OdeToFoodDb();

        public ActionResult Index(string searchTerm = null)
        {


            var model =
                _db.Restaurants
                .OrderByDescending(r => r.Reviews.Average(review => review.Rating))
                .Where(r => searchTerm == null || r.Name.StartsWith(searchTerm))
                .Take(10)
                .Select(r => new RestaurantListViewModel
                {
                    Id = r.Id,
                    Name = r.Name,
                    City = r.City,
                    Country = r.Country,
                    CountOfReviews = r.Reviews.Count()
                });

            if (Request.IsAjaxRequest())
            {
                return PartialView("_Restaurants", model);
            }

            return View(model);
        }

        public ActionResult About()
        {
            var model = new AboutModel();
            model.Name = "Tom";
            model.Location = "NYC, USA";

            return View(model);
        }

        public ActionResult Contact()
        {
            ViewBag.Message = "Your contact page.";

            return View();
        }

        protected override void Dispose(bool disposing)
        {
            if (_db != null)
            {
                _db.Dispose();
            }
            base.Dispose(disposing);
        }
    }
}

我在这里缺少什么吗?对于初学者来说,这个问题没有得到很好的记录,所以我创建了一个问题。如果这是一个愚蠢的错误,我深表歉意。

【问题讨论】:

    标签: jquery ajax linq entity-framework asp.net-mvc-4


    【解决方案1】:

    这是因为数据库不知道您的RestaurantListViewModel,EntityFramework 无法为此构造底层 SQL 查询。

    所以,额外拨打.ToList() 应该可以解决问题。

            var model =
                _db.Restaurants
                .OrderByDescending(r => r.Reviews.Average(review => review.Rating))
                .Where(r => searchTerm == null || r.Name.StartsWith(searchTerm))
                .Take(10)
    
                // The key is here
                .ToList()
    
                .Select(r => new RestaurantListViewModel
                {
                    Id = r.Id,
                    Name = r.Name,
                    City = r.City,
                    Country = r.Country,
                    CountOfReviews = r.Reviews.Count()
                });
    

    【讨论】:

    • 做到了,感谢您的帮助,不胜感激。一旦我对这些东西更加精通,我会回报别人的青睐。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-11
    • 2017-05-31
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多