2015-03-19 402 views
1

我正在尝试遵循以下教程:ASP.NET Web窗体Web窗体和Visual Studio入门(URL :http://www.asp.net/web-forms/overview/getting-started/getting-started-with-aspnet-45-web-forms/introduction-and-overview)。错误:无法将类型'System.Data.Entity.DbSet'隐式转换为'System.Linq.IQueryable'

我在我的项目中有其他名字,但想法是一样的。我正尝试为假日公园的客户创建一个预订系统。 我所做的一切都与本教程相同,但在出现错误时我不知道解决方案。在教程中,我在步骤5.

我得到的错误是:不能隐式转换类型'System.Data.Entity.DbSet(PortOfTroyCustomers.Models.Accommodation)'到'System.Linq.IQueryable(PortOfTroyCustomers.Accommodation )”。一个显式转换存在(是否缺少强制转换?)

这是Accommodation.aspx.cs的代码(在教程:ProductList.aspx.cs)这是错误occurted:

 public partial class Accommodation : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    public IQueryable<Accommodation> GetAccommodations([QueryString("id")] int? sortId) 
    { 
     var _db = new PortOfTroyCustomers.Models.PortOfTroyContext(); 
     IQueryable<Accommodation> query = _db.Accommodations; // This is the spot! 
     if (sortId.HasValue && sortId > 0) 
     { 
      query = query.Where(a => a.SortID == sortId); // and this! 
     } 
     return query; 
    } 

} 

其他代码:

类住宿代码(在教程几乎相同Product.cs):

public class Accommodation 
{ 
    [ScaffoldColumn(false)] 
    public int AccommodationID { get; set; } 

    public short NumberOfGuest { get; set; } 

    public string ImagePath { get; set; } 

    [Display(Name = "Richtprijs per week")] 
    [DataType(DataType.Currency)] // data type op geld zetten voor de double 
    public double? PricePerWeek { get; set; } 

    // foreign key 
    public int? SortID { get; set; } 
    public int? ResortID { get; set; } 

    // relaties leggen 
    public virtual Sort Sort { get; set; } 
    public virtual Resort Resort { get; set; } 
} 

类分类代码(在教程几乎相同Category.cs):

public class Sort 
{ 
    [ScaffoldColumn(false)] 
    [Display(Name = "Type")] 
    public int SortID { get; set; } 

    [Required, StringLength(100), Display(Name = "Name")] 
    public string Title { get; set; } 

    [Required, StringLength(10000), DataType(DataType.MultilineText)] 
    public string Description { get; set; } 

    public virtual ICollection<Accommodation> Accommodations { get; set; } 
} 

上下文代码:

public class PortOfTroyContext : DbContext 
{ 
    public PortOfTroyContext() : base("PortOfTroyCustomers") 
    { 
    } 

    public DbSet<Sort> Sorts { get; set; } 
    public DbSet<Accommodation> Accommodations { get; set; } 
    public DbSet<Resort> Resorts { get; set; } 
    public DbSet<Facility> Facilities { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     // nieuwe koppeltabel tussen Ficilities en Resorts (is namelijk een TNMT relatie) 
     modelBuilder.Entity<Facility>() 
      .HasMany(r => r.Resorts).WithMany(i => i.Facilities) 
      .Map(t => t.MapLeftKey("FicilityID") 
       .MapRightKey("ResortID") 
       .ToTable("FicilityResort")); 
    } 
} 

能否请你帮我这个错误?

回答

4

当你说: -

var _db = new PortOfTroyCustomers.Models.PortOfTroyContext(); 

编译器推断表达式的类型分配的权利,这就是所谓的在C#中隐式类型。

现在,你想转让,你这样的查询,我们就离开了它们是不同类型的右侧& System.Linq.IQueryableSystem.Data.Entity.DbSet: -

IQueryable<Accommodation> query = _db.Accommodations; 

因此,你需要一个明确的类型转换是这样的: -

IQueryable<Accommodation> query = (IQueryable<Accommodation>)_db.Accommodations; 
+0

谢谢!!这工作! :D和toppic:我现在有错误:'PortOfTroyCustomers.Accommodation'没有包含'SortID'的定义,也没有找到接受'PortOfTroyCustomers.Accommodation'类型的第一个参数的扩展方法'SortID'缺少使用指令或程序集引用?)。这个错误由​​SortID查询= query.Where(a => a.SortID == sortId);'。你知道我该如何解决这个错误吗?我也不知道如何解决这个错误。 – Marjolein 2015-03-19 14:00:51

+0

@Mjarolein - 我不知道你为什么要将它转换为'IQuerable ',而不是试试这个:''List query = _db.Accommodations.ToList();'它应该解决你的问题。 – 2015-03-19 14:13:07

+0

如果我这样做,我会得到和以前一样的错误。但现在通过** _ db.Accommodations.ToList()**/** SortID **/return ** query ** – Marjolein 2015-03-19 14:31:58

相关问题