2011-06-06 73 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