将类计算属性添加到类中会在使用Linq到NHibernate时抛出NHibernate错误

时间:2010-07-29 19:03:07

标签: nhibernate linq-to-nhibernate

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

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

public class IncompleteApplication : DealerBase
    {
        public virtual string Content { get; set; }
        public virtual string LegalBusinessName
        {
            get
            {
                return "Leg";
            }
        }
        public virtual string DbaName
        {
            get
            {
                return "Dba";
            }
        }
    }

映射:

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

            Map(app => app.Content);
        }
    }

并致电代码:

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

_Repository.GetAll()返回IQueryable。当我在GetAll()之后添加.ToList()时,代码运行得很好(尽管我得到了选择N + 1的情况)。

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

您应该使用nhibernate映射两个只读属性,并使用公式在查询时提供它们的值。我不太熟悉nh,但是你的属性的标准xml映射看起来像:

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

答案 1 :(得分:1)

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);