我有一组子类化的域对象,我用Linq和NHibernate获取。这是我的一个例子:
public abstract class Car {
public abstract bool Runs();
}
public class Junker : Car {
public override bool Runs() {
return false;
}
}
public class NewCar : Car {
public override bool Runs() {
return true;
}
}
我需要做的是只获取Run()
的汽车。所以,我想这样做:
var goodCars = _session.Query<Car>().Where(car => car.Runs());
...但是,这不起作用,因为Runs()
不是受支持的查询源。这是我得到的错误:
Cannot parse expression 'car' as it has an unsupported type. Only query sources (that is, expressions that implement IEnumerable) and query operators can be parsed.
我尝试将查询分为两个步骤:1)获取所有汽车,2)按Runs()
过滤...但我不能这样做,因为它打破了延迟加载(我的域模型是一个比我的汽车例子更复杂一些)。此外,我只想从数据库中获取实际符合我查询的项目。
有没有办法做我想做的事情?
答案 0 :(得分:2)
你不能这样做。你要做的事情是不可能转化为SQL查询,因为这是NHibernate最终做的所有......不。
要使用一个查询获取所有内容,您将需要降低到数据库级别并使用一些非域知识。我建议将其隐藏在服务接口后面。
public interface RunningCars { IEnumerable All(); }
使用自定义sql查询或存储过程实现它。
如何通过两个步骤来完成延迟加载?也许您需要指定在初始查询期间预先获取这些关联。
同样在这个具体的例子中,您是否只能获取NewCar的所有实例?
答案 1 :(得分:0)
如果您将运行转换为只读属性
public virtual bool Runs {get; private set;}
您可以在HBM中映射它并查询runs属性。但由于这不是你的实际模型,除了说
之外,没有其他方法可以指导你