Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取索引超出范围,NHibernate例外_C#_Linq_Nhibernate_Nhibernate Mapping_Linq To Nhibernate - Fatal编程技术网

C# 获取索引超出范围,NHibernate例外

C# 获取索引超出范围,NHibernate例外,c#,linq,nhibernate,nhibernate-mapping,linq-to-nhibernate,C#,Linq,Nhibernate,Nhibernate Mapping,Linq To Nhibernate,我目前正在用MVC和NHibernate构建一个web应用程序。现在,当我想从数据库中获取信息时,我得到一个索引超出范围异常 目前的情况如下 我得到了三个数据库表的映射文件: 用于存储与subscriberingroup具有一对多关系的组的表 <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> <joined-subclass name="CMS.Business.Entities.Subscriber, CMS.B

我目前正在用MVC和NHibernate构建一个web应用程序。现在,当我想从数据库中获取信息时,我得到一个索引超出范围异常

目前的情况如下

我得到了三个数据库表的映射文件:
用于存储与subscriberingroup具有一对多关系的组的表

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <joined-subclass name="CMS.Business.Entities.Subscriber, CMS.Business.Entities" extends="CMS.Business.Entities.BaseEntity, CMS.Business.Entities" table="CMS_Subscriber">
    <key column="Id" />
    <property name="Email" />
    <property name="FirstName" />
    <property name="Lastname" />
    <list name="SubscriberInGroup" cascade="all" table="CMS_SubscriberInGroup">
      <key column="SubscriberId" />
      <index column="Ordinal" />
      <one-to-many class="CMS.Business.Entities.SubscriberInGroup, CMS.Business.Entities" />
    </list>
  </joined-subclass>
</hibernate-mapping>  
执行此查询时,我得到了异常。奇怪的是当我这样做的时候:

var list = SubscriberService.GetSubcribersInGroup().ToList();
                var subscriberInGroup =
                    list.FirstOrDefault(
                        g => g.Subscriber.Email.Equals(viewModel.EmailAddress) && g.Group.Id == new Guid(s1));
它也像我预期的那样工作。GetSubscriberInGroup方法如下所示:

公共IQueryable GetSubcribersingGroup() { return_session.Linq(); }

我希望它能像第一个方法一样工作,因为表可以包含许多条目,而ToList()不是一个选项。所以,如果有人知道我为什么会出现这个错误,以及我是如何让它正常工作的,请分享你的知识

编辑:

下面是堆栈跟踪:

 at System.SZArrayHelper.get_Item[T](Int32 index)
   at NHibernate.Linq.Visitors.EntityExpressionVisitor.VisitMethodCall(MethodCallExpression expr)
   at NHibernate.Linq.Visitors.ExpressionVisitor.Visit(Expression exp)
   at NHibernate.Linq.Visitors.EntityExpressionVisitor.FindEntity(Expression expr, Boolean findFirst)
   at NHibernate.Linq.Visitors.BinaryCriterionVisitor.VisitMethodCall(MethodCallExpression expr)
   at NHibernate.Linq.Visitors.ExpressionVisitor.Visit(Expression exp)
   at NHibernate.Linq.Visitors.BinaryCriterionVisitor.GetBinaryCriteria(ICriteria rootCriteria, ISession session, BinaryExpression expr, ComparePropToValue comparePropToValue, ComparePropToProp comparePropToProp, CompareValueToCriteria compareValueToCriteria, ComparePropToCriteria comparePropToCriteria)
   at NHibernate.Linq.Visitors.WhereArgumentsVisitor.VisitBinaryCriterionExpression(BinaryExpression expr)
   at NHibernate.Linq.Visitors.WhereArgumentsVisitor.VisitBinary(BinaryExpression expr)
   at NHibernate.Linq.Visitors.ExpressionVisitor.Visit(Expression exp)
谢谢


Gerard必须将linq表达式转换为SQL。考虑到这一点

g.Group.Id.ToString().Equals(s1)
看起来有问题。linq到nhibernate必须能够生成将Group.Id转换为字符串并将其与另一个字符串进行比较的sql。。。而在你的工作示例中

g.Group.Id == new Guid(s1)
linq到nhibernate只需生成sql来比较两个GUI

在向nhibernate谈到linq时,Zoltan Hubai留下了一条评论,他得到了一个与您的代码类似的异常:

where d.Name.ToLower().StartsWith("a") 
Ayende的回答是:


``我认为目前我们不支持“d.Name.ToLower().StartsWith(“a”)”。

linq to nhibernate必须将linq表达式转换为SQL。考虑到这一点

g.Group.Id.ToString().Equals(s1)
看起来有问题。linq到nhibernate必须能够生成将Group.Id转换为字符串并将其与另一个字符串进行比较的sql。。。而在你的工作示例中

g.Group.Id == new Guid(s1)
linq到nhibernate只需生成sql来比较两个GUI

在向nhibernate谈到linq时,Zoltan Hubai留下了一条评论,他得到了一个与您的代码类似的异常:

where d.Name.ToLower().StartsWith("a") 
Ayende的回答是:


``我认为我们目前不支持“d.Name.ToLower().StartsWith(“a”)”。

在您的一个映射中,我看到您使用的是序号。这是否用于将您的订阅人分类到某个组中? 确保它具有正确的值,并且在数据库中以正确的方式更新这些值。例如,如果只有2条记录,序号从10开始,则很可能会出现此错误,因为将返回包含9个空(可为空)项的列表。执行where条件时,将引发异常


编辑:只是想知道为什么要在一组东西中订购订户。。如果没有必要,你可以试着用个袋子。这不需要在一个映射中出现序号列,我看到您使用的是序号。这是否用于将您的订阅人分类到某个组中? 确保它具有正确的值,并且在数据库中以正确的方式更新这些值。例如,如果只有2条记录,序号从10开始,则很可能会出现此错误,因为将返回包含9个空(可为空)项的列表。执行where条件时,将引发异常


编辑:只是想知道为什么要在一组东西中订购订户。。如果没有必要,你可以试着用个袋子。这不需要出现序号列

也可以发布堆栈跟踪吗?我添加了堆栈跟踪,希望您能找出问题所在!你也可以发布堆栈跟踪吗?我添加了堆栈跟踪,希望你能找出问题所在!谢谢你的回复。我已经尝试更改该行,使s1在我的linq语句中成为Guid,但没有任何区别。感谢您的回复。我已经尝试更改该行,使s1在我的linq语句中成为Guid,但没有任何区别。我没有想到这一点!其中序号从3开始而不是从0开始的行。。。我还将列表更改为一个包,并删除了序号列。这解决了我的问题!谢谢,我没想到!其中序号从3开始而不是从0开始的行。。。我还将列表更改为一个包,并删除了序号列。这解决了我的问题!感谢
g.Group.Id.ToString().Equals(s1)
g.Group.Id == new Guid(s1)
where d.Name.ToLower().StartsWith("a")