Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.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# LINQ NHibernate-仅为复杂对象选择几个字段(包括集合)_C#_Asp.net Mvc_Linq_Nhibernate_Linq To Nhibernate - Fatal编程技术网

C# LINQ NHibernate-仅为复杂对象选择几个字段(包括集合)

C# LINQ NHibernate-仅为复杂对象选择几个字段(包括集合),c#,asp.net-mvc,linq,nhibernate,linq-to-nhibernate,C#,Asp.net Mvc,Linq,Nhibernate,Linq To Nhibernate,我在我的一个项目(和ASP.NET MVC应用程序)中使用Fluent NHibernate,使用LINQ查询数据(使用LINQ to NHibernate库) 为了保护无辜者,改变了目标机的名称 假设我在数据库(MySQL)中有以下类Foo、Bar、Baz及其相应的表 Foo与Fluent映射中定义的Bar(表“FooBar”)和Baz(表“FooBaz”)都有多对多关系。因此,类接口定义如下: public class Foo { public virtual int id { ge

我在我的一个项目(和ASP.NET MVC应用程序)中使用Fluent NHibernate,使用LINQ查询数据(使用LINQ to NHibernate库)

为了保护无辜者,改变了目标机的名称

假设我在数据库(MySQL)中有以下类Foo、Bar、Baz及其相应的表

Foo与Fluent映射中定义的Bar(表“FooBar”)和Baz(表“FooBaz”)都有多对多关系。因此,类接口定义如下:

public class Foo {
    public virtual int id { get; set; }
    public virtual string name { get; set; }
    public virtual string email { get; set; }
    public virtual IList<Bar> bars { get; set; }
    public virtual IList<Baz> bazes { get; set; }
}
公共类Foo{
公共虚拟整数id{get;set;}
公共虚拟字符串名称{get;set;}
公共虚拟字符串电子邮件{get;set;}
公共虚拟IList条{get;set;}
公共虚拟IList bazes{get;set;}
}
这是一个相当标准的类。我们可以看到一个Foo对象将有一个酒吧和酒吧的列表

当尝试执行LINQ查询时会出现问题

如果我做这样一个简单的查询,它工作得很好(where子句不重要):

var foos=来自session.Linq()中的foo
其中email.equals(“foo@bar.com")
选择foo;
IList listFoos=foos.ToList();
这将返回一个foo列表,并填充所有字段(id、name、email、bar、baze)。log4net显示NHibernate对集合执行单独的查询

当我只想加载一些字段时,问题就出现了。例如,我可能只想加载查询中的条,而不想加载baze

此查询可编译,但在运行时产生错误:

var foos = from foo in session.Linq<Foo>()
           where email.equals("foo@bar.com")
           select new Foo() 
           {
               id = foo.id,
               name = foo.name,
               email = foo.email,
               bars = foo.bars
           };

IList<Foo> listFoos = foos.ToList();
var foos=来自session.Linq()中的foo
其中email.equals(“foo@bar.com")
选择newfoo()
{
id=foo.id,
name=foo.name,
email=foo.email,
巴=foo.bar
};
IList listFoos=foos.ToList();
我得到的错误与数组索引越界异常类似。堆栈跟踪显示了与LINQ NHibernate一侧的集合处理相关的一些方法名称,但没有其他内容。log4net报告的查询没有显示关于条的查询的迹象,这意味着在它有时间执行查询以选择条之前捕获了错误

以前有其他人有过这样的问题吗?你是怎么解决的?我不希望每次在应用程序中打开网页时都必须选择所有对象

谢谢大家!

编辑:根据要求,这里是堆栈跟踪。

System.IndexOutOfRangeException: L'index se trouve en dehors des limites du tableau. (read: "Index is out of bounds for the array.")

[IndexOutOfRangeException: L'index se trouve en dehors des limites du tableau.]
   NHibernate.Transform.TypeSafeConstructorMemberInitResultTransformer.InvokeMemberInitExpression(MemberInitExpression expression, Object[] args, Int32& argumentCount) +404
   NHibernate.Transform.TypeSafeConstructorMemberInitResultTransformer.TransformTuple(Object[] tuple, String[] aliases) +150

[QueryException: could not instantiate: Foo]
   NHibernate.Transform.TypeSafeConstructorMemberInitResultTransformer.TransformTuple(Object[] tuple, String[] aliases) +265
   NHibernate.Loader.Criteria.CriteriaLoader.GetResultColumnOrRow(Object[] row, IResultTransformer resultTransformer, IDataReader rs, ISessionImplementor session) +171
   NHibernate.Loader.Loader.GetRowFromResultSet(IDataReader resultSet, ISessionImplementor session, QueryParameters queryParameters, LockMode[] lockModeArray, EntityKey optionalObjectKey, IList hydratedObjects, EntityKey[] keys, Boolean returnProxies) +330
   NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) +704
   NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) +70
   NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters) +111
   NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor session, QueryParameters queryParameters) +18
   NHibernate.Loader.Loader.List(ISessionImplementor session, QueryParameters queryParameters, ISet`1 querySpaces, IType[] resultTypes) +79
   NHibernate.Impl.SessionImpl.List(CriteriaImpl criteria, IList results) +407
   NHibernate.Impl.CriteriaImpl.List(IList results) +41
   NHibernate.Impl.CriteriaImpl.List() +35
   NHibernate.Linq.<GetEnumerator>d__0.MoveNext() +71
   System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) +7665172
   System.Linq.Enumerable.ToList(IEnumerable`1 source) +61
   FooRepository.List(Int32 count) in C:\...\FooRepository.cs:38
   FooController.List() in C:\...\FooController.cs:30
   lambda_method(ExecutionScope , ControllerBase , Object[] ) +39
   System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +17
   System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +178
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +24
   System.Web.Mvc.<>c__DisplayClassa.<InvokeActionMethodWithFilters>b__7() +52
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +254
   System.Web.Mvc.<>c__DisplayClassc.<InvokeActionMethodWithFilters>b__9() +19
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +192
   System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +399
   System.Web.Mvc.Controller.ExecuteCore() +126
   System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +27
   System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +7
   System.Web.Mvc.MvcHandler.ProcessRequest(HttpContextBase httpContext) +151
   System.Web.Mvc.MvcHandler.ProcessRequest(HttpContext httpContext) +57
   System.Web.Mvc.MvcHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext httpContext) +7
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +181
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75
System.IndexOutOfRangeException:L'IndexE是一个表内有限公司。(读取:“索引超出数组的界限。”)
[指数例外情况:表内有限公司指数。]
NHibernate.Transform.TypeSafeConstructorMemberInitResultTransformer.InvokeMberInitExpression(MemberInitExpression表达式,对象[]args,Int32&argumentCount)+404
NHibernate.Transform.TypeSafeConstructorMemberInitResultTransformer.TransformTuple(对象[]元组,字符串[]别名)+150
[QueryException:无法实例化:Foo]
NHibernate.Transform.TypeSafeConstructorMemberInitResultTransformer.TransformTuple(对象[]元组,字符串[]别名)+265
NHibernate.Loader.Criteria.CriteriaLoader.GetResultColumnRow(对象[]行,IResultTransformer resultTransformer,IDataReader rs,ISessionImplementor会话)+171
NHibernate.Loader.Loader.GetRowFromResultSet(IDataReader resultSet,ISessionImplementor会话,QueryParameters QueryParameters,LockMode[]lockModeArray,EntityKey optionalObjectKey,IList HydreatedObject,EntityKey[]键,布尔返回代理)+330
NHibernate.Loader.Loader.DoQuery(ISessionImplementor会话,QueryParameters QueryParameters,Boolean returnProxies)+704
NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor会话、QueryParameters QueryParameters、Boolean returnProxies)+70
NHibernate.Loader.Loader.DoList(ISessionImplementor会话,QueryParameters QueryParameters)+111
NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor会话,QueryParameters QueryParameters)+18
NHibernate.Loader.Loader.List(ISessionImplementor会话,QueryParameters QueryParameters,ISet`1查询空间,IType[]结果类型)+79
NHibernate.Impl.SessionImpl.List(标准Impl标准,IList结果)+407
NHibernate.Impl.CriteriaImpl.List(IList结果)+41
NHibernate.Impl.CriteriaImpl.List()+35
NHibernate.Linq.d_u0.MoveNext()+71
System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)+7665172
System.Linq.Enumerable.ToList(IEnumerable`1源)+61
C:\…\FooRepository.cs:38中的FooRepository.List(Int32计数)
C:\…\FooController.cs:30中的FooController.List()
lambda_方法(ExecutionScope,ControllerBase,Object[])+39
System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase控制器,对象[]参数)+17
System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext ControllerContext,IDictionary`2参数)+178
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext ControllerContext,ActionDescriptor ActionDescriptor,IDictionary`2参数)+24
System.Web.Mvc.c__显示ClassA.b__7()+52
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter筛选器、ActionExecutingContext预文本、Func`1 continuation)+254
System.Web.Mvc.c__显示类c.b__9()+19
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext ControllerContext,IList`1筛选器,ActionDescriptor ActionDescriptor,IDictionary`2参数)+192
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext ControllerContext,String actionName)+399
System.Web.Mvc.Controller.ExecuteCore()+126
System.Web.Mvc.ControllerBase.Execute(RequestContext-RequestContext)+27
System.Web.Mvc.ControllerBase.System.Web.Mvc.ICo
System.IndexOutOfRangeException: L'index se trouve en dehors des limites du tableau. (read: "Index is out of bounds for the array.")

[IndexOutOfRangeException: L'index se trouve en dehors des limites du tableau.]
   NHibernate.Transform.TypeSafeConstructorMemberInitResultTransformer.InvokeMemberInitExpression(MemberInitExpression expression, Object[] args, Int32& argumentCount) +404
   NHibernate.Transform.TypeSafeConstructorMemberInitResultTransformer.TransformTuple(Object[] tuple, String[] aliases) +150

[QueryException: could not instantiate: Foo]
   NHibernate.Transform.TypeSafeConstructorMemberInitResultTransformer.TransformTuple(Object[] tuple, String[] aliases) +265
   NHibernate.Loader.Criteria.CriteriaLoader.GetResultColumnOrRow(Object[] row, IResultTransformer resultTransformer, IDataReader rs, ISessionImplementor session) +171
   NHibernate.Loader.Loader.GetRowFromResultSet(IDataReader resultSet, ISessionImplementor session, QueryParameters queryParameters, LockMode[] lockModeArray, EntityKey optionalObjectKey, IList hydratedObjects, EntityKey[] keys, Boolean returnProxies) +330
   NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) +704
   NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) +70
   NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters) +111
   NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor session, QueryParameters queryParameters) +18
   NHibernate.Loader.Loader.List(ISessionImplementor session, QueryParameters queryParameters, ISet`1 querySpaces, IType[] resultTypes) +79
   NHibernate.Impl.SessionImpl.List(CriteriaImpl criteria, IList results) +407
   NHibernate.Impl.CriteriaImpl.List(IList results) +41
   NHibernate.Impl.CriteriaImpl.List() +35
   NHibernate.Linq.<GetEnumerator>d__0.MoveNext() +71
   System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) +7665172
   System.Linq.Enumerable.ToList(IEnumerable`1 source) +61
   FooRepository.List(Int32 count) in C:\...\FooRepository.cs:38
   FooController.List() in C:\...\FooController.cs:30
   lambda_method(ExecutionScope , ControllerBase , Object[] ) +39
   System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +17
   System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +178
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +24
   System.Web.Mvc.<>c__DisplayClassa.<InvokeActionMethodWithFilters>b__7() +52
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +254
   System.Web.Mvc.<>c__DisplayClassc.<InvokeActionMethodWithFilters>b__9() +19
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +192
   System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +399
   System.Web.Mvc.Controller.ExecuteCore() +126
   System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +27
   System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +7
   System.Web.Mvc.MvcHandler.ProcessRequest(HttpContextBase httpContext) +151
   System.Web.Mvc.MvcHandler.ProcessRequest(HttpContext httpContext) +57
   System.Web.Mvc.MvcHandler.System.Web.IHttpHandler.ProcessRequest(HttpContext httpContext) +7
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +181
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75
        using( var session = sessionFactory.OpenSession() )
        {
            session.BeginTransaction();

            var foos =
                session.CreateCriteria(typeof(Foo))
                       .List<Foo>();

            var miniFoos = 
               foos.Select(f => new { f.email, f.bars })
                   .Where(f => f.email.Equals("foo@bar.com)
                   .ToList();

            session.Close();
         }
   ... 
   Select(a => new Forum {
   Id = a.Id, 
   Name = a.Name, 
   CategoryName = a.Categories.Select(b => b.Name).First() 
   })