将Linq用于NHibernate时,将计算属性添加到类会引发NHibernate错误

将Linq用于NHibernate时,将计算属性添加到类会引发NHibernate错误,nhibernate,linq-to-nhibernate,Nhibernate,Linq To Nhibernate,我向类中添加了一些计算的只读属性,它现在抛出一个QueryException:无法解析属性 这是我的课(现在是假计算): 映射: public class IncompleteApplicationMap : DealerBaseMap<IncompleteApplication> { public IncompleteApplicationMap() { Schema("Dealer"); Ta

我向类中添加了一些计算的只读属性,它现在抛出一个QueryException:无法解析属性

这是我的课(现在是假计算):

映射:

public class IncompleteApplicationMap : DealerBaseMap<IncompleteApplication>
    {
        public IncompleteApplicationMap()
        {
            Schema("Dealer");
            Table("XmlSerialization");

            Map(app => app.Content);
        }
    }
_GetAll()返回一个IQueryable。当我在GetAll()之后添加一个.ToList()时,代码运行得很好(尽管我得到了selectn+1的情况)


谢谢你的帮助

您应该将两个只读属性映射到nhibernate,并在查询时使用公式提供它们的值。我对fluent nh不太了解,但您的属性的标准xml映射类似于:

<property name="DbaName" access="readonly" insert="false" update="false" type="String" formula="(SELECT 'Dba')" />

nHibernate正在生成一条sql语句以在服务器上执行。 数据库中不存在计算字段,因此无法在nHibernate查询中使用它们

您所能做的是对满足所有条件(计算字段除外)的对象执行查询,然后在.ToArray()之后对这些对象使用linq

data.GridDataItems = (from app in _Repository.GetAll()
                                  select new GridData.GridDataItem()
                                  {
                                      ID = app.Id,
                                      SubmittedDate = app.LastUpdated,
                                      UserName = app.User.UserName,
                                  }).ToArray().Where(i=> i.LegalBusinessName = app.LegalBusinessName && i.DbaName = app.DbaName);

这似乎是一个糟糕的处理方式。为什么我要我的查询来处理这个问题?似乎更好的做法是告诉NHibernate一个字段没有映射。不确定是NHibernate还是Linq把我弄到这里来。@Mike:据我所知,这是目前NH Linq提供商(尽管可能很不幸)能够干净地处理这件事的唯一方法。虽然不完全可取,但这将允许您在HQL/etc中查询这些计算字段,并解决linq提供程序的问题…Yikes。希望有人会插话。@Mike:我想我看不出这有什么大问题(除了一点重复);使用这种方法,客户端和服务器端的查询是相同的-这可能是一件令人满意的事情…让我们说公式,因为一个完全复杂的公式。。。现在,您需要数据库服务器执行根本不应该执行的操作。
<property name="DbaName" access="readonly" insert="false" update="false" type="String" formula="(SELECT 'Dba')" />
data.GridDataItems = (from app in _Repository.GetAll()
                                  select new GridData.GridDataItem()
                                  {
                                      ID = app.Id,
                                      SubmittedDate = app.LastUpdated,
                                      UserName = app.User.UserName,
                                  }).ToArray().Where(i=> i.LegalBusinessName = app.LegalBusinessName && i.DbaName = app.DbaName);