Asp.net mvc 4 在MVC Web Api中使用EntitySetController扩展集合

Asp.net mvc 4 在MVC Web Api中使用EntitySetController扩展集合,asp.net-mvc-4,asp.net-web-api,odata,linq-to-nhibernate,Asp.net Mvc 4,Asp.net Web Api,Odata,Linq To Nhibernate,我正在使用OData框架(版本5.0.0)和MVC Web Api(MVC版本4.0.305060),无法使$expand查询用于我的集合 根据“支持的场景”下更具体的案例2,我应该能够扩展集合以在单个查询中包含它们的数据,但我的$expand查询似乎完全被忽略了。没有错误,响应完全相同,就像我完全忽略了$expand一样 这是我的数据结构(部分): DebtCalculation - string Name - string Description - Collecti

我正在使用OData框架(版本5.0.0)和MVC Web Api(MVC版本4.0.305060),无法使$expand查询用于我的集合

根据“支持的场景”下更具体的案例2,我应该能够扩展集合以在单个查询中包含它们的数据,但我的$expand查询似乎完全被忽略了。没有错误,响应完全相同,就像我完全忽略了$expand一样

这是我的数据结构(部分):

DebtCalculation
    - string Name
    - string Description
    - Collection<Expense> Expenses
    - Collection<Participant> Participants

Participant
    - bool HasPaid
    - User User
    - DebtCalculation DebtCalculation

Expense
    - decimal Amount
    - User Payer
    - Collection<Debtor> Debtors
    - DebtCalculation DebtCalculation
债务计算的元数据如下所示:

    <EntityType Name="DebtCalculation">
            <Key>
                    <PropertyRef Name="Id"/>
            </Key>
            <Property Name="Id" Type="Edm.Int64" Nullable="false"/>
            <Property Name="Name" Type="Edm.String"/>
            <Property Name="Description" Type="Edm.String"/>
            <NavigationProperty Name="Participants" Relationship="Sujut.Core.Sujut_Core_DebtCalculation_Participants_Sujut_Core_Participant_ParticipantsPartner" ToRole="Participants" FromRole="ParticipantsPartner"/>
            <NavigationProperty Name="Expenses" Relationship="Sujut.Core.Sujut_Core_DebtCalculation_Expenses_Sujut_Core_Expense_ExpensesPartner" ToRole="Expenses" FromRole="ExpensesPartner"/>
    </EntityType>

认识到任何问题吗

编辑:

问题似乎是将ODataController查询与Linq到NHibernate相结合。这是堆栈跟踪。升级到NH4.0.0.1000 alpha版本并没有解决问题。似乎是关于同一个问题

System.ArgumentException
at System.Linq.Expressions.Expression.Condition(Expression test, Expression ifTrue, Expression ifFalse)
 at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitConditionalExpression(ConditionalExpression expression)
 at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitExpression(Expression expression)
 at NHibernate.Linq.Visitors.NhExpressionTreeVisitor.VisitExpression(Expression expression)
 at NHibernate.Linq.NestedSelects.SelectClauseRewriter.VisitExpression(Expression expression)
 at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitBinaryExpression(BinaryExpression expression)
 at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitExpression(Expression expression)
 at NHibernate.Linq.Visitors.NhExpressionTreeVisitor.VisitExpression(Expression expression)
 at NHibernate.Linq.NestedSelects.SelectClauseRewriter.VisitExpression(Expression expression)
 at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitConditionalExpression(ConditionalExpression expression)
 at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitExpression(Expression expression)
 at NHibernate.Linq.Visitors.NhExpressionTreeVisitor.VisitExpression(Expression expression)
 at NHibernate.Linq.NestedSelects.SelectClauseRewriter.VisitExpression(Expression expression)
 at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitMemberAssignment(MemberAssignment memberAssigment)
 at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitMemberBinding(MemberBinding memberBinding)
 at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitList[T](ReadOnlyCollection`1 list, Func`2 visitMethod)
 at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitMemberBindingList(ReadOnlyCollection`1 expressions)
 at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitMemberInitExpression(MemberInitExpression expression)
 at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitExpression(Expression expression)
 at NHibernate.Linq.Visitors.NhExpressionTreeVisitor.VisitExpression(Expression expression)
 at NHibernate.Linq.NestedSelects.SelectClauseRewriter.VisitExpression(Expression expression)
 at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitMemberAssignment(MemberAssignment memberAssigment)
 at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitMemberBinding(MemberBinding memberBinding)
 at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitList[T](ReadOnlyCollection`1 list, Func`2 visitMethod)
 at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitMemberBindingList(ReadOnlyCollection`1 expressions)
 at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitMemberInitExpression(MemberInitExpression expression)
 at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitExpression(Expression expression)
 at NHibernate.Linq.Visitors.NhExpressionTreeVisitor.VisitExpression(Expression expression)
 at NHibernate.Linq.NestedSelects.SelectClauseRewriter.VisitExpression(Expression expression)
 at NHibernate.Linq.NestedSelects.NestedSelectRewriter.ReWrite(QueryModel queryModel, ISessionFactory sessionFactory)
 at NHibernate.Linq.Visitors.QueryModelVisitor.GenerateHqlQuery(QueryModel queryModel, VisitorParameters parameters, Boolean root)
 at NHibernate.Linq.NhLinqExpression.Translate(ISessionFactoryImplementor sessionFactory)
 at NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(String queryIdentifier, IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary`2 filters, ISessionFactoryImplementor factory)
 at NHibernate.Engine.Query.HQLExpressionQueryPlan.CreateTranslators(String expressionStr, IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory)
 at NHibernate.Engine.Query.HQLExpressionQueryPlan..ctor(String expressionStr, IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory)
 at NHibernate.Engine.Query.HQLExpressionQueryPlan..ctor(String expressionStr, IQueryExpression queryExpression, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory)
 at NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow, IDictionary`2 enabledFilters)
 at NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow)
 at NHibernate.Impl.AbstractSessionImpl.CreateQuery(IQueryExpression queryExpression)
 at NHibernate.Linq.DefaultQueryProvider.PrepareQuery(Expression expression, IQuery& query, NhLinqExpression& nhQuery)
 at NHibernate.Linq.DefaultQueryProvider.Execute(Expression expression)
 at NHibernate.Linq.DefaultQueryProvider.Execute[TResult](Expression expression)
 at Remotion.Linq.QueryableBase`1.System.Collections.IEnumerable.GetEnumerator()
 at System.Web.Http.OData.Formatter.Serialization.ODataFeedSerializer.WriteFeed(IEnumerable enumerable, IEdmTypeReference feedType, ODataWriter writer, ODataSerializerContext writeContext)
 at System.Web.Http.OData.Formatter.Serialization.ODataFeedSerializer.WriteObjectInline(Object graph, IEdmTypeReference expectedType, ODataWriter writer, ODataSerializerContext writeContext)
 at System.Web.Http.OData.Formatter.Serialization.ODataFeedSerializer.WriteObject(Object graph, Type type, ODataMessageWriter messageWriter, ODataSerializerContext writeContext)
 at System.Web.Http.OData.Formatter.ODataMediaTypeFormatter.WriteToStream(Type type, Object value, Stream writeStream, HttpContent content, HttpContentHeaders contentHeaders)
 at System.Web.Http.OData.Formatter.ODataMediaTypeFormatter.WriteToStreamAsync(Type type, Object value, Stream writeStream, HttpContent content, TransportContext transportContext)
 --- End of stack trace from previous location where exception was thrown ---
 at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
 at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
 at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
 at System.Web.Http.WebHost.HttpControllerHandler.<WriteBufferedResponseContentAsync>d__14.MoveNext()
System.ArgumentException
at System.Linq.Expressions.Expression.Condition(表达式测试、表达式ifTrue、表达式ifFalse)
at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitConditionalExpression(条件表达式)
at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitExpression(表达式)
在NHibernate.Linq.Visitors.nhexpressionontreevisitor.VisitExpression(表达式)
在NHibernate.Linq.NestedSelects.selectClaureWriter.VisitExpression(表达式)
at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitBinaryExpression(二进制表达式)
at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitExpression(表达式)
在NHibernate.Linq.Visitors.nhexpressionontreevisitor.VisitExpression(表达式)
在NHibernate.Linq.NestedSelects.selectClaureWriter.VisitExpression(表达式)
at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitConditionalExpression(条件表达式)
at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitExpression(表达式)
在NHibernate.Linq.Visitors.nhexpressionontreevisitor.VisitExpression(表达式)
在NHibernate.Linq.NestedSelects.selectClaureWriter.VisitExpression(表达式)
at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitMemberAssignment(MemberAssignment MemberAssignment)
at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitMemberBinding(MemberBinding MemberBinding)
at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitList[T](只读集合'1列表,函数'2访问方法)
at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitMemberBindingList(只读集合`1表达式)
在Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitMemberInitExpression(MemberInitExpression)处
at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitExpression(表达式)
在NHibernate.Linq.Visitors.nhexpressionontreevisitor.VisitExpression(表达式)
在NHibernate.Linq.NestedSelects.selectClaureWriter.VisitExpression(表达式)
at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitMemberAssignment(MemberAssignment MemberAssignment)
at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitMemberBinding(MemberBinding MemberBinding)
at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitList[T](只读集合'1列表,函数'2访问方法)
at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitMemberBindingList(只读集合`1表达式)
在Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitMemberInitExpression(MemberInitExpression)处
at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitExpression(表达式)
在NHibernate.Linq.Visitors.nhexpressionontreevisitor.VisitExpression(表达式)
在NHibernate.Linq.NestedSelects.selectClaureWriter.VisitExpression(表达式)
在NHibernate.Linq.NestedSelects.NestedSelectRewriter.ReWrite(QueryModel QueryModel,ISessionFactory sessionFactory)
在NHibernate.Linq.Visitors.QueryModelVisitor.GenerateHqlQuery(QueryModel QueryModel,VisitorParameters,布尔根)
在NHibernate.Linq.NhLinqExpression.Translate(ISessionFactoryImplementor sessionFactory)
在NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(字符串查询标识符、IQueryExpression查询表达式、字符串集合角色、布尔浅层、IDictionary`2过滤器、ISessionFactoryImplementor工厂)
在NHibernate.Engine.Query.HQLExpressionQueryPlan.CreateTranslators(字符串表达式str、IQueryExpression queryExpression、字符串集合角色、布尔浅值、IDictionary`2启用过滤器、ISessionFactoryImplementor工厂)
在NHibernate.Engine.Query.HQLExpressionQueryPlan..ctor(字符串表达式str、IQueryExpression queryExpression、字符串集合角色、布尔浅值、IDictionary`2启用过滤器、ISessionFactoryImplementor工厂)
在NHibernate.Engine.Query.HQLExpressionQueryPlan..ctor(字符串表达式str、IQueryExpression queryExpression、布尔浅值、IDictionary`2启用过滤器、ISessionFactoryImplementor工厂)
在NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(IQueryExpression queryExpression,布尔浅值,IDictionary`2 enabledFilters)
位于NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(IQueryExpression queryExpression,布尔浅层)
位于NHibernate.Impl.AbstractSessionImpl.CreateQuery(IQueryExpression queryExpression)
在NHibernate.Linq.DefaultQueryProvider.PrepareQuery(表达式、IQuery和查询、NhLinqExpression和nhQuery)
在NHibernate.Linq.DefaultQueryProvider.Execute(表达式)
在NHibernate.Linq.DefaultQueryProvider.Execute[TResult](表达式)
at Remotion.Linq.QueryableBase`1.System.Collections.IEnumerable.GetEnumerator()
位于System.Web.Http.OData.Formatter.Serialization.ODataFeedSerializer.WriteFeed(IEnumerable enumerable,IEdmTypeReference feedType,ODataWriter writer,ODataSerializerContext writeContext)
System.ArgumentException
at System.Linq.Expressions.Expression.Condition(Expression test, Expression ifTrue, Expression ifFalse)
 at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitConditionalExpression(ConditionalExpression expression)
 at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitExpression(Expression expression)
 at NHibernate.Linq.Visitors.NhExpressionTreeVisitor.VisitExpression(Expression expression)
 at NHibernate.Linq.NestedSelects.SelectClauseRewriter.VisitExpression(Expression expression)
 at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitBinaryExpression(BinaryExpression expression)
 at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitExpression(Expression expression)
 at NHibernate.Linq.Visitors.NhExpressionTreeVisitor.VisitExpression(Expression expression)
 at NHibernate.Linq.NestedSelects.SelectClauseRewriter.VisitExpression(Expression expression)
 at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitConditionalExpression(ConditionalExpression expression)
 at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitExpression(Expression expression)
 at NHibernate.Linq.Visitors.NhExpressionTreeVisitor.VisitExpression(Expression expression)
 at NHibernate.Linq.NestedSelects.SelectClauseRewriter.VisitExpression(Expression expression)
 at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitMemberAssignment(MemberAssignment memberAssigment)
 at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitMemberBinding(MemberBinding memberBinding)
 at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitList[T](ReadOnlyCollection`1 list, Func`2 visitMethod)
 at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitMemberBindingList(ReadOnlyCollection`1 expressions)
 at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitMemberInitExpression(MemberInitExpression expression)
 at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitExpression(Expression expression)
 at NHibernate.Linq.Visitors.NhExpressionTreeVisitor.VisitExpression(Expression expression)
 at NHibernate.Linq.NestedSelects.SelectClauseRewriter.VisitExpression(Expression expression)
 at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitMemberAssignment(MemberAssignment memberAssigment)
 at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitMemberBinding(MemberBinding memberBinding)
 at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitList[T](ReadOnlyCollection`1 list, Func`2 visitMethod)
 at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitMemberBindingList(ReadOnlyCollection`1 expressions)
 at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitMemberInitExpression(MemberInitExpression expression)
 at Remotion.Linq.Parsing.ExpressionTreeVisitor.VisitExpression(Expression expression)
 at NHibernate.Linq.Visitors.NhExpressionTreeVisitor.VisitExpression(Expression expression)
 at NHibernate.Linq.NestedSelects.SelectClauseRewriter.VisitExpression(Expression expression)
 at NHibernate.Linq.NestedSelects.NestedSelectRewriter.ReWrite(QueryModel queryModel, ISessionFactory sessionFactory)
 at NHibernate.Linq.Visitors.QueryModelVisitor.GenerateHqlQuery(QueryModel queryModel, VisitorParameters parameters, Boolean root)
 at NHibernate.Linq.NhLinqExpression.Translate(ISessionFactoryImplementor sessionFactory)
 at NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(String queryIdentifier, IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary`2 filters, ISessionFactoryImplementor factory)
 at NHibernate.Engine.Query.HQLExpressionQueryPlan.CreateTranslators(String expressionStr, IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory)
 at NHibernate.Engine.Query.HQLExpressionQueryPlan..ctor(String expressionStr, IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory)
 at NHibernate.Engine.Query.HQLExpressionQueryPlan..ctor(String expressionStr, IQueryExpression queryExpression, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory)
 at NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow, IDictionary`2 enabledFilters)
 at NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow)
 at NHibernate.Impl.AbstractSessionImpl.CreateQuery(IQueryExpression queryExpression)
 at NHibernate.Linq.DefaultQueryProvider.PrepareQuery(Expression expression, IQuery& query, NhLinqExpression& nhQuery)
 at NHibernate.Linq.DefaultQueryProvider.Execute(Expression expression)
 at NHibernate.Linq.DefaultQueryProvider.Execute[TResult](Expression expression)
 at Remotion.Linq.QueryableBase`1.System.Collections.IEnumerable.GetEnumerator()
 at System.Web.Http.OData.Formatter.Serialization.ODataFeedSerializer.WriteFeed(IEnumerable enumerable, IEdmTypeReference feedType, ODataWriter writer, ODataSerializerContext writeContext)
 at System.Web.Http.OData.Formatter.Serialization.ODataFeedSerializer.WriteObjectInline(Object graph, IEdmTypeReference expectedType, ODataWriter writer, ODataSerializerContext writeContext)
 at System.Web.Http.OData.Formatter.Serialization.ODataFeedSerializer.WriteObject(Object graph, Type type, ODataMessageWriter messageWriter, ODataSerializerContext writeContext)
 at System.Web.Http.OData.Formatter.ODataMediaTypeFormatter.WriteToStream(Type type, Object value, Stream writeStream, HttpContent content, HttpContentHeaders contentHeaders)
 at System.Web.Http.OData.Formatter.ODataMediaTypeFormatter.WriteToStreamAsync(Type type, Object value, Stream writeStream, HttpContent content, TransportContext transportContext)
 --- End of stack trace from previous location where exception was thrown ---
 at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
 at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
 at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
 at System.Web.Http.WebHost.HttpControllerHandler.<WriteBufferedResponseContentAsync>d__14.MoveNext()
  // Using Chinook Database
  Album albumAlias = null;
  Track trackAlias = null;
  Artist artistAlias = null;
  return session.QueryOver<Album>(() => albumAlias)
    .Left.JoinAlias(() => albumAlias.Tracks, () => trackAlias)
    .Left.JoinAlias(() => albumAlias.Artist, () => artistAlias)
    .TransformUsing(Transformers.DistinctRootEntity)
    .List().AsQueryable();
DebtCalculation debtCalculationAlias = null;
Expense expenseAlias = null;
Participant participantAlias = null;
session.QueryOver<DebtCalculation>(() => debtCalculationAlias)
.Left.JoinAlias(() => debtCalculationAlias.Expenses, () => expenseAlias)
.Left.JoinAlias(() => debtCalculationAlias.Participants, () => participantAlias)
.TransformUsing(Transformers.DistinctRootEntity)
.List().AsQueryable();