1

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

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 Query?

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

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

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

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

4

3 回答 3

1

我尚未对其进行测试,但开源项目NHibernate.OData可能对您有用。

于 2012-04-26T01:02:15.827 回答
0

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

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

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

于 2012-04-24T15:31:13.873 回答
0

AutoMapper 通过Queryable Extensions支持这种情况

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);
}
于 2017-03-27T14:37:49.833 回答