我可以允许被查询的对象影响使用Linq和NHibernate获取它们的查询吗
本文关键字:查询 NHibernate 获取 Linq 对象 我可以 影响 | 更新日期: 2023-09-27 18:20:07
我有一组用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()
进行过滤。。。但我不能这样做,因为它破坏了LazyLoading(我的领域模型比我的汽车模型更复杂)。此外,我只想从数据库中提取真正适合我的查询的项目。
有办法做我想做的事吗?
您不能这样做。您试图做的事情是不可能转换成SQL查询的,因为这就是NHibernate最终要做的。。。编号
要想通过一个查询获得所有信息,需要降到数据库级别并使用一些非领域知识。我建议将其隐藏在服务接口后面。
公共接口RunningCars{IEnumerable All();}
并使用自定义sql查询或存储过程来实现它。
如何通过两个步骤来打破懒惰加载?也许您需要指定要在初始查询期间预取这些关联。
同样在这个特定的例子中,你不能直接获取NewCar的所有实例吗?
如果将Run转换为只读属性
public virtual bool Runs {get; private set;}
您可以在HBM中映射它并查询runs属性。但由于这不是你的实际模型,除了说之外,没有其他方法可以帮助你
- 更改模型
- 不能查询对象方法