使用OData和asp.net MVC webapi查询NHibernate数据库

时间:2012-04-24 04:48:22

标签: nhibernate asp.net-mvc-4 asp.net-web-api

我怀疑这只是NHibernate特有的。但我的代码如下......

public class ClientController : ApiController
    {
        // GET /api/<controller>
        public IQueryable<Api.Client> Get()
        {
            return Repositories.Clients.Query().Select(c => Mapper.Map<Client, Api.Client>(c));
        }

我基本上想要使用Odata标准查询数据库....获取相关的“客户”对象,并将它们转换为DTO'Api.Client'。

但......代码原样,不起作用。因为NHibernate不知道用Mapper做什么....它真的希望查询在.Select之前。但我不确定我能先获得Odata查询吗?

如果我这样做,它将起作用

return Repositories.Clients.Query().Select(c => Mapper.Map<Client, Api.Client>(c)).ToList().AsQueryable();

但是这有点太糟糕了,因为你必须从数据库中获取所有客户端才能进行OData查询。

无论如何在OData查询后都会发生“选择”吗?或者另一种方法来解决这个问题?

3 个答案:

答案 0 :(得分:1)

我还没有测试它,但开源项目NHibernate.OData可能对你有用。

答案 1 :(得分:0)

问题是你试图在NH调用中执行C#代码(Mapper.Map)(转换为SQL)

您必须手动映射Api.Client,或者创建一个返回Expression<Func<Client, Api.Client>>的Mapper实现,并将其作为参数直接传递给Select()

即便如此,我也不确定NHibernate是否会翻译它。但你可以试试。

答案 2 :(得分:0)

AutoMapper使用Queryable Extensions支持此方案

// ---------- ---------- multiproj/build.properties ---------- ---------- //
scala.version = 2.11.8
// ---------- ---------- multiproj/subproj/build.sbt ---------- ---------- //
val props = SettingKey[Map[String, String]]("props")

props := {
  import scala.collection.JavaConversions._
  val pf = new java.util.Properties()
  IO.load(pf, baseDirectory.value / ".." / "build.properties")
  pf.stringPropertyNames.map(p => p -> Option(System.getProperty(p)).getOrElse(pf.getProperty(p))).toMap
}

libraryDependencies ++= Seq(
  "org.scala-lang" % "scala-library"  % props.value("scala.version") % "compile->*"
, "org.scala-lang" % "scala-compiler" % props.value("scala.version") % "compile->*"
)

public IQueryable<Api.Client> Get() {
    return Repositories.Clients.Query().Select(c => Mapper.Map<Client, Api.Client>(c));
}