У меня настроен проект бизнес-приложения Silverlight с этими кодами.
У меня есть этот класс домена:
public class BaseDomain
{
public virtual Guid Id { get; set; }
public virtual DateTime CreatedOn { get; set; }
}
public class Sector : BaseDomain
{
public virtual string Code { get; set; }
public virtual string Name { get; set; }
}
Сопоставление объектов домена установлено и работает нормально.
У меня есть этот класс DTO:
public class SectorDto : BaseDto
{
[Key]
public virtual Guid Id { get; set; }
public virtual DateTime CreatedOn { get; set; }
public virtual string Code { get; set; }
public virtual string Name { get; set; }
public SectorDto()
{
}
public SectorDto(Sector d)
{
Id = d.Id;
CreatedOn = d.CreatedOn;
Code = d.Code;
Name = d.Name;
}
}
DTO используется для выравнивания объекта и предотвращения ненужных связей при сериализации и передаче по проводу.
Тогда у меня есть этот RIA DomainService (есть несколько вариантов метода GetSectors (), я объясню позже):
[EnableClientAccess]
public class OrganizationService : BaseDomainService
{
public IQueryable<SectorDto> GetSectors1()
{
return GetSession().Linq<Sector>()
.Select(x => Mapper.Map<Sector, SectorDto>(x));
}
public IQueryable<SectorDto> GetSectors2()
{
return GetSession().Linq<Sector>().ToList()
.Select(x => new SectorDto(x)).AsQueryable();
}
public IQueryable<SectorDto> GetSectors3()
{
return GetSession().Linq<Sector>().Select(x => new SectorDto(x));
}
public IQueryable<SectorDto> GetSectors4()
{
return GetSession().Linq<Sector>().Select(x => new SectorDto() {
Id = x.Id, CreatedOn = x.CreatedOn, Name = x.Name, Code = x.Code });
}
}
BaseDomainService - это просто родительский класс, обеспечивающий обработку сеанса NHibernate. Я настроил сеанс на каждый веб-запрос.
Затем я подключаю сервис к DataGrid (Silverlight Toolkit) на странице XAML:
var ctx = new App.Web.Services.OrganizationContext();
SectorGrid.ItemsSource = ctx.SectorDtos;
ctx.Load(s.GetSectors1Query());
При вызове различных методов я получил следующие результаты:
Метод GetSectors1 () создает исключение "Не удалось выполнить операцию загрузки для запроса 'GetSectors1'. Невозможно привести объект типа NHibernate.Linq.Expressions.EntityExpression 'к типу' NHibernate .Linq.Expressions.CollectionAccessExpression»". .
Это лучший способ, которого я пытаюсь достичь. Я хочу использовать библиотеку AutoMapper для автоматического сопоставления класса домена с DTO. Я совершенно уверен, что проблема не в AutoMapper, поскольку я также получаю сообщение об ошибке, если вызываю метод из анонимного метода, переданного в Select, например. GetSession().Linq<Sector>().Select(x => CustomMap(x))
.
Метод GetSectors2 () правильно отображает данные в сетке, но это лишает цели использования IQueryable, вызов не будет обрабатываться лениво.
Метод GetSectors3 () извлекает данные, но только Id и CreatedOn, которые находятся в родительском классе BaseDomain. Код и Имя не имеют значения.
Метод GetSectors4 () извлекает данные правильно и лениво оценивается, но я не хочу вручную каждый раз сопоставлять свой домен с DTO, как это!
Так что же дает? Результаты настолько далеки, чем я ожидал! Есть идеи, как заставить это работать? Любой совет?
Я ценю любую помощь, я почти потерян. Большое спасибо.