我可以允许查询的对象影响使用Linq和NHibernate获取它们的查询吗?

时间:2012-01-10 19:45:14

标签: c# linq nhibernate

我有一组子类化的域对象,我用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()过滤...但我不能这样做,因为它打破了延迟加载(我的域模型是一个比我的汽车例子更复杂一些)。此外,我只想从数据库中获取实际符合我查询的项目。

有没有办法做我想做的事情?

2 个答案:

答案 0 :(得分:2)

你不能这样做。你要做的事情是不可能转化为SQL查询,因为这是NHibernate最终做的所有......不。

要使用一个查询获取所有内容,您将需要降低到数据库级别并使用一些非域知识。我建议将其隐藏在服务接口后面。

public interface RunningCars {   IEnumerable All(); }

使用自定义sql查询或存储过程实现它。

如何通过两个步骤来完成延迟加载?也许您需要指定在初始查询期间预先获取这些关联。

同样在这个具体的例子中,您是否只能获取NewCar的所有实例?

答案 1 :(得分:0)

如果您将运行转换为只读属性

public virtual bool Runs {get; private set;}

您可以在HBM中映射它并查询runs属性。但由于这不是你的实际模型,除了说

之外,没有其他方法可以指导你
  1. 更改模型
  2. 您无法查询对象方法