System.NotSupportedException:'LINQ to Entities中不支持指定的类型成员'StartDateTime'

时间:2017-09-11 10:44:47

标签: c# visual-studio linq notsupportedexception

运行我的项目后,visual studio在我的Index.cshtml中向我展示了这个System.NotSupportedException

enter image description here

这是我的HomeController

public class HomeController : BaseController
{
    public ActionResult Index()
    {
        var events = this.db.Events
            .OrderBy(e => e.StartDateTime)
            .Where(e => e.IsPublic)
            .Select(e => new EventViewModel()
            {
                Id = e.Id,
                Title = e.Title,
                Duration = e.Duration,
                Author= e.Author.FullName,
                Location = e.Location
            });

        var upcomingEvents = events.Where(e => e.StartDateTime > DateTime.Now);
        var passedEvents = events.Where(e => e.StartDateTime <= DateTime.Now);
        return View(new UpcomingPassedEventsViewModel()
        {
            UpcomingEvents = upcomingEvents,
            PassedEvents = passedEvents
        });
    }
}

}

这是我的EventViewModel.cs

public class EventViewModel
{
    public int Id { get; set; }

    public string Title { get; set; }

    public DateTime StartDateTime { get; set; }

    public TimeSpan? Duration { get; set; }

    public string Author { get; set; }

    public string Location { get; set; }
}

2 个答案:

答案 0 :(得分:0)

您将实体投影到视图模型中。这是一件好事,但之后您无法再次为查看模型优化查询。您在EventViewModel.StartDateTime上查询,您甚至不会映射。

您需要在映射之前添加查询。当然,您不想复制映射代码,因此请将其放在方法中:

public ActionResult Index()
{ 
    var events = this.db.Events
                     .OrderBy(e => e.StartDateTime)
                     .Where(e => e.IsPublic);

    var upcomingEvents = events.Where(e => e.StartDateTime > DateTime.Now);
    var passedEvents = events.Where(e => e.StartDateTime <= DateTime.Now);

    return View(new UpcomingPassedEventsViewModel()
    {
        UpcomingEvents = upcomingEvents.Select(Map).ToList(),
        PassedEvents = passedEvents.Select(Map).ToList()
    });
}

private EventViewModel Map(EventDataModel e)
{
    return new EventViewModel()
    {
        Id = e.Id,
        Title = e.Title,
        Duration = e.Duration,
        Author= e.Author.FullName,
        Location = e.Location
    };
}

答案 1 :(得分:0)

&#34; BugFinder&#34;回答了我的问题。我的活动没有举办StartDateTime。所以,这是答案

var events = this.db.Events
            .OrderBy(e => e.StartDateTime)
            .Where(e => e.IsPublic)
            .Select(e => new EventViewModel()
            {
                Id = e.Id,
                Title = e.Title,
                StartDateTime = e.StartDateTime,
                Duration = e.Duration,
                Author= e.Author.FullName,
                Location = e.Location
            });