我有两个实现接口的类。接口作为参数传递给一个方法,然后在下面的NHibernate语法中作为T类使用
Session.Query<T>()
然而,由于接口是由两个类实现的,因此由Session运行的SQL。查询是2个Select语句(Select ..)从男孩。和选择…从女孩)。
我需要知道的是如何将icchild参数"转换"为一个类,然后使用该类填充Session.Query()调用。
代码如下。正如你所看到的,我有一个变通的办法,但它不是很漂亮,并且有多个icchild类将成为大量重复的代码。
谢谢!
public interface IChild
{
DateTime Date { get; }
Parent Parent { get; set; }
}
public class Boy : IChild
{
public virtual Parent Parent { get; set; }
public virtual DateTime GraduationDate { get; set; }
public virtual DateTime Date { get { return GraduationDate; } set { } }
}
public class Girl : IChild
{
public virtual Parent Parent { get; set; }
public virtual DateTime WeddingDate { get; set; }
public virtual DateTime Date { get { return WeddingDate; } set { } }
}
public bool Create(IChild entity)
{
//Is there an existing child record for the key details
IChild child = null;
if(entity is Boy)
{
child = Session.Query<Boy>()
.Where(x => x.Date == entity.Date)
.SingleOrDefault();
}
else if (entity is Girl)
{
child = Session.Query<Girl>()
.Where(x => x.Date == entity.Date)
.SingleOrDefault();
}
return child.Parent != null;
}
使用泛型:
public bool Create<T>(T entity)
where t : class, IChild
{
//Is there an existing child record for the key details
IChild child = null;
child = Session.Query<T>()
.Where(x => x.Date == entity.Date)
.SingleOrDefault();
return child.Parent != null;
}
泛型方法需要传递给它的实际编译时类类型,而不是一些运行时类型,所以除非有这个方法的非泛型版本接受运行时类型指示,否则我猜您使用这种方法是不走运的。然而,你可以将创建移动到子类本身,并将会话传递给它,这将把这个单体函数分开,并将其分发给具有编译时类类型知识的子类,这些子类将传递给泛型方法。
public interface IChild
{
DateTime Date { get; }
Parent Parent { get; set; }
IChild Create(Session session);
}
public class Boy : IChild
{
public virtual Parent Parent { get; set; }
public virtual DateTime GraduationDate { get; set; }
public virtual DateTime Date { get { return GraduationDate; } set { } }
public virtual IChild Create(Session session) { return session.Query<Boy>().Where(x => x.Date == entity.Date).SingleOrDefault(); }
}
public class Girl : IChild
{
public virtual Parent Parent { get; set; }
public virtual DateTime WeddingDate { get; set; }
public virtual DateTime Date { get { return WeddingDate; } set { } }
public virtual IChild Create(Session session) { return session.Query<Girl>().Where(x => x.Date == entity.Date).SingleOrDefault(); }
}
public bool Create(IChild entity)
{
//Is there an existing child record for the key details
return entity.Create(Session).Parent != null;
}