【问题标题】:Linq to NHibernate issueLinq to NHibernate 问题
【发布时间】:2010-09-01 13:08:36
【问题描述】:

我目前有生成以下 LINQ 表达式的代码(取自 WhoCanHelpMe 展示项目)。它的目的是将两个表达式绑定在一起,但我不知道下面是否真的是一个有效的表达式:

.Where(p => (p.PostCodes
      .Any(pc =>(pc = value(PatchByPostCodeSpecification).postCode)) &&
         Invoke(p => p.Teams
                    .Any(t => (Convert(t.TeamType) = 
                     Convert(value(PatchByBookingTypeSpecification).bookingType))), 
         p
       )
      ));

当计算表达式时,我得到一个 Object reference not set to an instance of an object 异常,并带有以下堆栈跟踪:

在 NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetEntityName(ICriteria subcriteria, String propertyName) 在 NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetColumns(字符串属性名,ICriteria 子标准) 在 NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetColumnsUsingProjection(ICriteria 子标准,字符串 propertyName) 在 NHibernate.Criterion.CriterionUtil.GetColumnNamesUsingPropertyName(ICriteriaQuery 条件查询,ICriteria 条件,字符串 propertyName,对象值,ICriterion critertion) 在 NHibernate.Criterion.CriterionUtil.GetColumnNamesForSimpleExpression(字符串属性名称,IProjection 投影,ICriteriaQuery 标准查询,ICriteria 标准,IDictionary2 enabledFilters, ICriterion criterion, Object value) at NHibernate.Criterion.SimpleExpression.ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery, IDictionary2 enabledFilters) 在 NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetWhereCondition(IDictionary2 enabledFilters) at NHibernate.Loader.Criteria.CriteriaJoinWalker..ctor(IOuterJoinLoadable persister, CriteriaQueryTranslator translator, ISessionFactoryImplementor factory, ICriteria criteria, String rootEntityName, IDictionary2 enabledFilters) 在 NHibernate.Criterion.SubqueryExpression.ToSqlString(ICriteria 条件,ICriteriaQuery 条件查询,IDictionary2 enabledFilters) at NHibernate.Criterion.Junction.ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery, IDictionary2 enabledFilters) 在 NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetWhereCondition(IDictionary2 enabledFilters) at NHibernate.Loader.Criteria.CriteriaJoinWalker..ctor(IOuterJoinLoadable persister, CriteriaQueryTranslator translator, ISessionFactoryImplementor factory, ICriteria criteria, String rootEntityName, IDictionary2 enabledFilters) 在 NHibernate.Loader.Criteria.CriteriaLoader..ctor(IOuterJoinLoadable 持久化器,ISessionFactoryImplementor 工厂,CriteriaImpl rootCriteria,字符串 rootEntityName,IDictionary2 enabledFilters) at NHibernate.Impl.SessionImpl.List(CriteriaImpl criteria, IList results) at NHibernate.Impl.CriteriaImpl.List(IList results) at NHibernate.Impl.CriteriaImpl.List() at NHibernate.Linq.CriteriaResultReader1.List() 在 NHibernate.Linq.CriteriaResultReader1.<GetEnumerator>d__0.MoveNext() at System.Collections.Generic.List1..ctor(IEnumerable1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable1 源) 在 Environment.Core.Specifications.QuerySpecification2.SatisfyingElementsFrom(IQueryable1 候选人)在 C:\DEV\Environment\Environment\app\Environment.Core\Specifications\QuerySpecification.cs:line 30 在 Environment.Data.NHibernate.LinqRepository1.FindAll(ILinqSpecification2 规范)在 C:\DEV\Environment\Environment\app\Environment.Data\NHibernate\LinqRepository.cs:line 43 ........

更新

我尝试在不使用复杂表达式的情况下运行查询:

.Where(p => (p.PostCodes
      .Any(pc =>
          (pc = value(PatchByPostCodeSpecification).postCode)
          )));

同样的错误仍然发生。

【问题讨论】:

    标签: linq nhibernate linq-to-nhibernate


    【解决方案1】:

    您没有使用 linq 到对象。 NHibernate.Linq 是一个 Linq 提供程序。

    这意味着 - 它需要知道如何将您的谓词翻译有效的 SQL

    现在问自己一个问题 - nhibernate 支持的所有数据库到底是如何知道 .net 类型转换的?


    抱歉,我想我需要更多的指针。更完整的代码示例会有帮助吗?

    在我看来 - 你正在努力完成不可能的事情。我无法提供可以解决您的问题的代码示例,因为我不知道您的实际目标是什么。我只能看到您使用的技术有误。

    NHibernate.Linq 能够翻译成类似的 sql 表达式

    orders.Any(o=&gt;o.Customers.Any(c=&gt;c.IsDead)).Where(o=&gt;o.Price==10)

    但它不能翻译成类似的sql表达式

    orders.Where(o=&gt;{Console.WriteLine("foo"); MsgBox("bar"); return false;})

    【讨论】:

    • 对不起,我想我需要更多的指针。更完整的代码示例会有帮助吗?
    【解决方案2】:

    这是因为表达式正在比较两个 PostCode 对象而不是比较属性。我更改了表达式,以便生成以下内容:

    .Where(p => (p.PostCodes
      .Any(pc =>
          (pc.Name = value(PatchByPostCodeSpecification).postCode.Name)
          )));
    

    【讨论】:

    • 我仍然对 value(...) 函数感到困惑。那是什么?但是,是的 - 它通常与这样的 linq 提供程序一起使用。如果它不起作用 - 尝试更简单地表达自己,它可能会。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多