我使用这些代码建立了一个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会话提供处理的父类。我将会话设置为根据Web请求进行直播。
然后,将服务连接到XAML页面中的DataGrid(Silverlight Toolkit):
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()获取数据,但仅获取父类BaseDomain中的Id和CreatedOn。代码和名称均为空。

方法GetSectors4()正确地获取数据并懒惰地求值,但是我不想每次都这样手动将我的域映射到DTO!


那有什么呢?结果远远超出我的预期!对如何进行这项工作有任何想法吗?有什么建议吗?
感谢您的帮助,我差点迷路了。非常感谢你。

最佳答案

GetSession()。Linq()。ToList()。Select(x => CustomMap(x))

另见http://www.mail-archive.com/[email protected]/msg12003.html

07-28 02:42
查看更多