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

使用OData和asp.net MVC webapi对NHibernate数据库进行查询,nhibernate,asp.net-mvc-4,asp.net-web-api,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.M

我怀疑这只是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条件查询数据库。。。。获取相关的“Client”对象,并将其转换为DTO“Api.Client”

但是。。。目前的代码不起作用。因为NHibernate不知道如何使用映射器。。。。它确实希望查询出现在.Select之前。但我不确定能不能先得到Odata查询

如果我这样做,它会起作用的

return Repositories.Clients.Query().Select(c => Mapper.Map<Client, Api.Client>(c)).ToList().AsQueryable();
但这有点糟糕,因为必须从数据库中获取所有客户机才能对其执行OData查询


在OData查询之后,是否仍要进行选择?或者另一种方法?

问题是,您试图在转换为SQL的NH调用中执行C代码Mapper.Map

您必须手动映射Api.Client,或者创建一个返回表达式的映射器实现,并将其作为参数直接传递给选择


即使这样,我也不确定NHibernate是否会翻译它。但是您可以尝试。

问题是您试图在转换为SQL的NH调用中执行C代码Mapper.Map

您必须手动映射Api.Client,或者创建一个返回表达式的映射器实现,并将其作为参数直接传递给选择


即使这样,我也不确定NHibernate是否会翻译它。但是您可以尝试。

我还没有测试它,但是开源项目可能对您有用。

我还没有测试它,但是开源项目可能对您有用。

AutoMapper通过

变成


AutoMapper通过

变成


实际上,我认为当您希望查询只使用DTO对象上可用的内容时,问题会变得更糟。您需要查询通过映射接口,然后返回到数据库……实际上,我认为当您希望查询只使用DTO对象上可用的内容时,问题会变得更糟。您需要查询通过映射界面,然后返回数据库……是的,我知道这是我的问题。。。。我不确定是否有现成的好办法。是的,我知道这是我的问题。。。。我不确定有没有现成的好办法。
public IQueryable<Api.Client> Get() {
    return Repositories.Clients.Query().Select(c => Mapper.Map<Client, Api.Client>(c));
}
public IQueryable<Api.Client> Get() {
    return Repositories.Clients.Query().ProjectTo<Api.Client>(mapper.ConfigurationProvider);
}