C# 我可以在NHibernate中将接口用作DTO吗?

C# 我可以在NHibernate中将接口用作DTO吗?,c#,nhibernate,dto,modularity,C#,Nhibernate,Dto,Modularity,我通过我的查询减少了通过线路传输的字节数,当我写的时候。。。我意识到我应该能够将接口传递给QueryOver对象,并获取该接口属性的指定列 是否可以将接口传递给QueryOver对象的select或类似命令?它是否只返回“映射”到接口的列 例如: Repository .QueryOver<MyTable>() .Select(table => table as IJustWantTheseColumnsInterface) .Execute(Param

我通过我的查询减少了通过线路传输的字节数,当我写的时候。。。我意识到我应该能够将接口传递给QueryOver对象,并获取该接口属性的指定列

是否可以将接口传递给QueryOver对象的select或类似命令?它是否只返回“映射”到接口的列

例如:

Repository
    .QueryOver<MyTable>()
    .Select(table => table as IJustWantTheseColumnsInterface)
    .Execute(Parameters);
//or

Repository
    .QueryOver<MyTable>()
    .Select<IJustWantTheseColumnsInterface>()
    .Execute(Parameters);

//...

public class Table : IJustWantTheseColumnsInterface
{
    public string FirstName { get; set; }
    public string MiddleName { get; set; }
    public string LastName { get; set; }
    public Address Address { get; set; }
    public Phone Phone { get; set; }
    public DateTime BirthDate { get; set; }
    public Occupation Occupation { get; set; }
    public Employer Employer { get; set; }
    //etc...
}

public interface IJustWantTheseColumnsInterface
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public Phone Phone { get; set; }
}
存储库
.QueryOver()
.Select(表=>表作为ijustwant列插入界面)
.执行(参数);
//或
存储库
.QueryOver()
.选择()
.执行(参数);
//...
公共类表:ijustwant生态列界面
{
公共字符串名{get;set;}
公共字符串MiddleName{get;set;}
公共字符串LastName{get;set;}
公共广播地址{get;set;}
公用电话{get;set;}
公共日期时间出生日期{get;set;}
公共职业{get;set;}
公共雇主{get;set;}
//等等。。。
}
公共接口ijustwant显示列界面
{
公共字符串名{get;set;}
公共字符串LastName{get;set;}
公用电话{get;set;}
}

为什么不能创建第二个只映射到这些列的实现

public class Table : IJustWantTheseColumnsInterface
{
    public virtual int Id { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string MiddleName { get; set; }
    public virtual string LastName { get; set; }
    public virtual Address Address { get; set; }
    public virtual Phone Phone { get; set; }
    public virtual DateTime BirthDate { get; set; }
    public virtual Occupation Occupation { get; set; }
    public virtual Employer Employer { get; set; }
}

public class SameTable : IJustWantTheseColumnsInterface
{
    public virtual int Id { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
    public virtual Phone Phone { get; set; }
}

public interface IJustWantTheseColumnsInterface
{
    int Id { get; set; }
    string FirstName { get; set; }
    string LastName { get; set; }
    Phone Phone { get; set; }
}

public class SameTableMap : ClassMap<SameTable>
{
    public SameTableMap()
    {
        Table("Table");
        Id(x => x.Id, "ID");

        Map(x => x.FirstName, "FIRST_NAME");
        Map(x => x.LastName, "LAST_NAME");

        Reference(x => x.Phone, "PHONE_ID");
    }
}
公共类表:ijustwant生态列界面
{
公共虚拟整数Id{get;set;}
公共虚拟字符串FirstName{get;set;}
公共虚拟字符串MiddleName{get;set;}
公共虚拟字符串LastName{get;set;}
公共虚拟地址{get;set;}
公共虚拟电话{get;set;}
公共虚拟日期时间出生日期{get;set;}
公共虚拟占用{get;set;}
公共虚拟雇主{get;set;}
}
公共类SameTable:ijustwant此生态列位于界面
{
公共虚拟整数Id{get;set;}
公共虚拟字符串FirstName{get;set;}
公共虚拟字符串LastName{get;set;}
公共虚拟电话{get;set;}
}
公共接口ijustwant显示列界面
{
int Id{get;set;}
字符串名{get;set;}
字符串LastName{get;set;}
电话{get;set;}
}
公共类SameTableMap:ClassMap
{
公共SameTableMap()
{
表(“表”);
Id(x=>x.Id,“Id”);
Map(x=>x.FirstName,“FIRST_NAME”);
Map(x=>x.LastName,“LAST_NAME”);
参考(x=>x.Phone,“Phone_ID”);
}
}
您还可以使用一个接口作为ClassMap的T

同样,如果Phone属性是Table类中的interface IPhone类型。您可以这样指定要返回的实现

public interface IJustWantTheseColumnsInterface
{
    ...
    IPhone Phone { get; set; }
    ...
}

public class SameTableMap : ClassMap<SameTable>
{
    public SameTableMap()
    {
        ...
        Reference(x => x.Phone, "PHONE_ID").Class(typeof(Phone));
        ...
    }
}
公共接口ijustwant此列在接口中
{
...
IPhone手机{get;set;}
...
}
公共类SameTableMap:ClassMap
{
公共SameTableMap()
{
...
参考(x=>x.Phone,“Phone_ID”).Class(typeof(Phone));
...
}
}
现在如果你想得到你的部分实体

IJustWantTheseColumnsInterface someVariable = session.Get<SameTable>();
ijustwanttthesecolumnsinterface someVariable=session.Get();

这是一个解决办法,不是答案,请评论问题。这一行包含构建查询所需的所有信息,并且写得非常简洁。。。Repository.QueryOver().Select().Execute(参数)@我没有意识到这一点,所以我相信我的回答是唯一的办法。我很感激你找到了这样一个简洁的答案,因为我将来肯定会自己使用它。@furrier我为沟通错误道歉,我的评论没有想象的那么清楚。所写的行包含所需的所有信息。我正在研究这一行应该如何编写(无论NHibernate是否内置),如果没有,是否可能使用扩展方法。我至少从未见过NHibernate的这种语法。