2011-06-06 108 views
3

我一直在关注Pro ASP.net MVC 2框架,我发现它非常出色。但这是一个真正的学习曲线,现在我陷入困境。Linq lambda加入错误

在本书中,您将构建如下所示的内容,以便进行分页。

public ViewResult List([DefaultValue(0)] string cityzip, [DefaultValue(1)] int page) 
{ 

var roomsToShow = roomsRepository.Rooms.Where(x => x.CountryID == cityzip); 

var viewModel = new RoomsListViewModel 
{ 

    Rooms = roomsToShow.Skip((page - 1) * PageSize).Take(PageSize).ToList(), 
    PagingInfo = new PagingInfo 
    { 
     CurrentPage = page, 
     ItemsPerPage = PageSize, 
     TotalItems = roomsToShow.Count() 
    } 
}; 
return View(viewModel); // Passed to view as ViewData.Model (or simply Model) 

} 

我觉得需要去适应这一点,这样我就可以做搜索

public ViewResult List([DefaultValue(0)] string cityzip, [DefaultValue(1)] int page) 
{ 

var roomsToShow = roomsRepository.Rooms.Join(
        roomCoordinatesRepository.RoomCoordinates, 
        room => room.RoomID, 
        roomCoordinate => roomCoordinate.RoomID, 
        (room, roomCoordinate) => new { RoomCoordinate = roomCoordinate, Room = room }); 

var viewModel = new RoomsListViewModel 
{ 

    Rooms = roomsToShow.Skip((page - 1) * PageSize).Take(PageSize).ToList(), 
    PagingInfo = new PagingInfo 
    { 
     CurrentPage = page, 
     ItemsPerPage = PageSize, 
     TotalItems = roomsToShow.Count() 
    } 
}; 
return View(viewModel); // Passed to view as ViewData.Model (or simply Model) 

} 

一个加入...但我马上就得到一个智能感知错误说 - 无法隐式转换类型'System.Collections.Generic.List<AnonymousType#1>''System.Collections.Generic.IList<MeetingRoom.Domain.Entities.Room>'。一个明确的转换存在(你是否缺少演员?)

我明显不明白代码,足以找出错误。我也感觉有点出我的深度与此LAMDA LINQ东西

室是被定义为一个域对象:

namespace MeetingRoom.Domain.Entities 
    { 
     [Table(Name = "Rooms")] 
     public class Room 
     { 
      [Column(IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert)] 
      public int RoomID { get; set; } 
      [Column] public string Name { get; set; } 
      [Column] public string Description { get; set; } 
      [Column] public decimal Price { get; set; } 
      [Column] public string Category { get; set; } 
      [Column] public string Pcode { get; set; } 
      [Column] public int CountryID { get; set; } 


      public MeetingRooms.Domain.entities.RoomCoordinate RoomCoordinate { get; set; } 
     } 
    } 

,并代表我的室的桌子上。我是否需要某种代表房间和坐标表之间联接的父实体?

的坐标实体看起来是这样的:

namespace MeetingRooms.Domain.entities 
{ 
    [Table(Name = "RoomCoordinate")] 
    public class RoomCoordinate 
    { 
     [Column(IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.OnInsert, Name = "ID")] 
     public int CoordID { get; set; } 
     [Column] 
     public int RoomID { get; set; } 
     [Column] 
     public string Coordinates { get; set; } 
     [Column] 
     public decimal Latitude { get; set; } 
     [Column] 
     public decimal Longitude { get; set; } 
    } 
} 

的RoomsListViewModel看起来像如下: 命名空间MeetingRoomsMVC.WebUI.Models { 公共类RoomsListViewModel { 公众的IList RoomsWithCoordinates {获得;组; } public PagingInfo PagingInfo {get;组; }
}}

回答

1

这里的基础上,OP的进一步说明我的建议:

1)创建一个同时拥有RoomRoomCoordinates信息的集合类:

public class RoomWithCoordinates 
{ 
    public Room Room { get; set; } 
    public RoomCoordinates Coordinates { get; set; } 
} 

2)修改控制器动作如下:

public ViewResult List([DefaultValue(0)] string cityzip, [DefaultValue(1)] int page) 
{ 

var roomsToShow = roomsRepository.Rooms.Join(
        roomCoordinatesRepository.RoomCoordinates, 
        room => room.RoomID, 
        roomCoordinate => roomCoordinate.RoomID, 
        (room, roomCoordinate) => new RoomWithCoordinates{ Coordinates = roomCoordinate, Room = room }); 

var viewModel = new RoomsListViewModel 
{ 

    RoomsWithCoordinates = roomsToShow.Skip((page - 1) * PageSize).Take(PageSize).ToList(), 
    PagingInfo = new PagingInfo 
    { 
     CurrentPage = page, 
     ItemsPerPage = PageSize, 
     TotalItems = roomsToShow.Count() 
    } 
}; 
return View(viewModel); // Passed to view as ViewData.Model (or simply Model) 

} 

3)修改您的RoomsListViewModel类和您的视图以反映这些更改。

+0

感谢您的看法,它似乎有所帮助,应用程序现在可以构建并运行,但当我单击搜索以进入List方法时,出现错误: 查询包含对在不同数据上下文中定义的项目的引用。错误发生在这一行 - var viewModel = new RoomsListViewModel – iKode 2011-06-06 13:54:21

+0

我已经在上面添加了RoomsListViewModel的结构 – iKode 2011-06-06 13:56:00

+0

这可能与我不熟悉的DB框架有关。我认为你需要以某种方式在数据上下文中注册'RoomWithCoordinates'类,但是我不能给你这个确切的指导,对不起 – Zruty 2011-06-06 14:05:55

3

的问题是,在此代码

var roomsToShow = roomsRepository.Rooms.Join(
       roomCoordinatesRepository.RoomCoordinates, 
       room => room.RoomID, 
       roomCoordinate => roomCoordinate.RoomID, 
       (room, roomCoordinate) => new { RoomCoordinate = roomCoordinate, Room = room }); 

你就构造匿名类型对象的IEnumerable(room, roomCoordinate) => new { RoomCoordinate = roomCoordinate, Room = room }

,然后在你的下一行”重新尝试将其分配到Room的列表中。

的问题可以通过最初创建正确的项目类型的IEnumerable解决:

var roomsToShow = roomsRepository.Rooms.Join(
       roomCoordinatesRepository.RoomCoordinates, 
       room => room.RoomID, 
       roomCoordinate => roomCoordinate.RoomID, 
       (room, roomCoordinate) => new MeetingRoom.Domain.Entities.Room{ RoomCoordinate = roomCoordinate, Room = room }); 

(注意在lambda类名)。

+0

我现在(房间,roomCoordinate)=>新的MeetingRoom.Domain.Entities.Room **房间** =房间}} ---错误是---'MeetingRoom.Domain.Entities出错。房间“不包含'房间'的定义\t应该创建一个代表连接的新域实体,因此由房间和房间坐标表/对象组成? – iKode 2011-06-06 12:19:41

+0

好吧,那是一个关于你房间类型的猜测。你能否详细说明你在这个行动中究竟想做什么?在这种情况下,我可以想出一个适当的解决方案 – Zruty 2011-06-06 12:26:47

+0

我试图做一个SQL选择与房间表和房间坐标表上的加入相当。我有上面添加的现有域实体。我想列举这些作为搜索结果,因此分页代码。一旦我有这个工作,我需要在那里添加某种where子句,以限制它到某些坐标。谢谢你的帮助Zruty,我真的很感激它。 – iKode 2011-06-06 12:30:30