代码之家  ›  专栏  ›  技术社区  ›  David Neale

Linq到NHibernate问题

  •  0
  • David Neale  · 技术社区  · 15 年前

    WhoCanHelpMe showcase项目)。它的目的是将两个表达式绑定在一起,但我不知道下面的表达式是否有效:

    .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标准Cri先生TeriQueryTranslator.GetColumnsUsingProjection=获取列使用投影(ICriteria次标准,字符串属性名称) 在标准.GetColumnNamesForSimpleExpression(字符串属性名称、IProjection投影、ICriteriaQuery准则查询、ICriteria准则、IDictionary 2 enabledFilters, ICriterion criterion, Object value) at NHibernate.Criterion.SimpleExpression.ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery, IDictionary 2个启用的筛选器) 在NHibernate.Loader.Criteria标准Cri先生teriaQueryTranslator.GetWhereCondition文件(i词典) 2 enabledFilters) at NHibernate.Loader.Criteria.CriteriaJoinWalker..ctor(IOuterJoinLoadable persister, CriteriaQueryTranslator translator, ISessionFactoryImplementor factory, ICriteria criteria, String rootEntityName, IDictionary 在NHibernate.criteria.SubqueryExpression子查询表达式.ToSqlString(ICriteria criteria、ICriteriaQuery criteriaQuery、IDictionary) 2 enabledFilters) at NHibernate.Criterion.Junction.ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery, IDictionary 2个启用的筛选器) 在NHibernate.Loader.Criteria标准Cri先生teriaQueryTranslator.GetWhereCondition文件(i词典) 在NHibernate.Loader.Criteria标准.CriteriaLoader..ctor(IOuterJoinLoadable持久器,ISessionFactoryImplementor工厂,CriteriaImpl rootCriteria,String rootEntityName,IDictionary) 2 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.CriteriaResultReader 1.列表() 1.<GetEnumerator>d__0.MoveNext() at System.Collections.Generic.List 1..ctor(IEnumerable) 1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable 1个来源) 2.SatisfyingElementsFrom(IQueryable 在环境.Data.NHibernate.LinqRepository公司 1.FindAll(ILinqSpecification 2)在C:\DEV\Environment\Environment\app中\环境.数据\纤维酸盐\LinqRepository.cs文件:第43行 ........

    更新

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

    同样的错误仍然发生。

    2 回复  |  直到 15 年前
        1
  •  1
  •   Arnis Lapsa    15 年前

    您没有使用linq对象。林克郡是Linq提供程序。

    这意味着-它需要知道如何 翻译 将谓词转换为 有效SQL .

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


    对不起,我想我需要更多的指针。一个更完整的代码示例会有帮助吗?

    在我看来,你是在试图完成不可能的事情。我不能提供代码样本来解决你的问题,因为我不知道你的实际目标是什么。我所能看到的就是你用错了技术。

    林克郡能够转换为sql表达式,如

    orders.Any(o=>o.Customers.Any(c=>c.IsDead)).Where(o=>o.Price==10)

    但是它不能转换成像这样的sql表达式

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

        2
  •  0
  •   David Neale    15 年前

    PostCode 而不是在属性上进行比较。我更改了表达式以便生成以下内容:

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