Linq лямбда-ошибка соединения - PullRequest
3 голосов
/ 06 июня 2011

Я следил за книгой Pro ASP.net MVC 2 Framework, которая показалась мне довольно блестящей. Но это реальная кривая обучения, и теперь я застрял.

В книге вы создаете что-то похожее на приведенное ниже, что позволяет выполнять подкачку.

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) 

} 

... но сразу же я получаю ошибку intellisense, говорящую - Не удалось неявно преобразовать тип '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; }
      }
    }

и представляет мой стол в комнате. Нужна ли какая-то родительская сущность, которая представляла бы соединение между таблицей Room и координатами Room?

Координатная сущность выглядит следующим образом:

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 { public IList RoomsWithCoordinates {get; задавать; } public PagingInfo PagingInfo {get; задавать; }
} }

Ответы [ 2 ]

3 голосов
/ 06 июня 2011

Проблема в том, что в этом коде

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 });

(обратите внимание наимя класса в лямбде).

1 голос
/ 06 июня 2011

Вот мое предложение, основанное на дальнейшем описании ОП:

1) Создайте агрегатный класс, содержащий как Room, так и RoomCoordinates info:

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 класс и ваше представление, чтобы отразить эти изменения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...