我怀疑这只是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查询后都会发生“选择”吗?或者另一种方法来解决这个问题?
答案 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));
}