我可以允许被查询的对象影响使用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(我的领域模型比我的汽车模型更复杂)。此外,我只想从数据库中提取真正适合我的查询的项目。

有办法做我想做的事吗?

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

您不能这样做。您试图做的事情是不可能转换成SQL查询的,因为这就是NHibernate最终要做的。。。编号

要想通过一个查询获得所有信息,需要降到数据库级别并使用一些非领域知识。我建议将其隐藏在服务接口后面。

公共接口RunningCars{IEnumerable All();}

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

如何通过两个步骤来打破懒惰加载?也许您需要指定要在初始查询期间预取这些关联。

同样在这个特定的例子中,你不能直接获取NewCar的所有实例吗?

如果将Run转换为只读属性

public virtual bool Runs {get; private set;}

您可以在HBM中映射它并查询runs属性。但由于这不是你的实际模型,除了说之外,没有其他方法可以帮助你

  1. 更改模型
  2. 不能查询对象方法