c # скомпилированное лямбда-выражение для доступа к свойству объекта, которое является свойством другого объекта, выдает исключение - PullRequest
0 голосов
/ 17 июня 2011

После моего предыдущего вопроса:

Лямбда-выражение для доступа к свойству объекта, который является свойством другого объекта в c #

У меня теперь другая проблема:

var param = Expression.Parameter(typeof(GAcordos.Models.Contratos), "x");
                    var body = Expression.Equal(Expression.PropertyOrField(Expression.PropertyOrField(param, propName[0]), columnName.ToString()), fixedItem, false, Type.GetType("GAcordos.Helpers.Comparators").GetMethod(oper, new Type[] { propType, propType }));
                    var lambda = Expression.Lambda<Func<GAcordos.Models.Contratos, bool>>(body, param);

                    contratosList = contratosList.Where(lambda).AsQueryable();

При передаче лямбды в метод Expression.Where он не выполняет метод замены, который я дал для Equal Expression, и выполняет стандартное сравнение Equal.

Если я скомпилирую лямбду:

contratosList = contratosList.Where(lambda.Compile()).AsQueryable();

, она выдаст исключение Ссылка на объект не установлена ​​на экземпляр объекта. позже в View со следующей трассировкой стека:

 at lambda_method(Closure , Contratos )
 at System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext()
 at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
 at System.Linq.OrderedEnumerable`1.<GetEnumerator>d__0.MoveNext()
 at System.Linq.Enumerable.Count[TSource](IEnumerable`1 source)
 at lambda_method(Closure )
 at System.Linq.EnumerableExecutor`1.Execute()
 at System.Linq.EnumerableQuery`1.System.Linq.IQueryProvider.Execute[S](Expression expression)
 at System.Linq.Queryable.Count[TSource](IQueryable`1 source)
 at MvcContrib.Pagination.LazyPagination`1.TryExecuteQuery() in C:\Users\daniel.almeida\Downloads\MVCContrib.source\src\MVCContrib\Pagination\LazyPagination.cs:line 62
 at MvcContrib.Pagination.LazyPagination`1.get_TotalItems() in C:\Users\daniel.almeida\Downloads\MVCContrib.source\src\MVCContrib\Pagination\LazyPagination.cs:line 85
 at MvcContrib.UI.Pager.Pager.ToHtmlString() in C:\Users\daniel.almeida\Downloads\MVCContrib.source\src\MVCContrib\UI\Pager\Pager.cs:line 130
 at MvcContrib.UI.Pager.Pager.ToString() in C:\Users\daniel.almeida\Downloads\MVCContrib.source\src\MVCContrib\UI\Pager\Pager.cs:line 125
 at ASP._Page_Views_Shared_Pager_cshtml.Execute() in c:\inetpub\wwwroot\Empresas\Proactivos\GAcordos\GAcordos\Views\Shared\Pager.cshtml:line 4
 at System.Web.WebPages.WebPageBase.ExecutePageHierarchy()
 at System.Web.Mvc.WebViewPage.ExecutePageHierarchy()
 at System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage)
 at System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance)
 at System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer)
 at System.Web.Mvc.HtmlHelper.RenderPartialInternal(String partialViewName, ViewDataDictionary viewData, Object model, TextWriter writer, ViewEngineCollection viewEngineCollection)
 at System.Web.Mvc.Html.RenderPartialExtensions.RenderPartial(HtmlHelper htmlHelper, String partialViewName, Object model)
 at ASP._Page_Views_Contratos_Index_cshtml.Execute() in c:\inetpub\wwwroot\Empresas\Proactivos\GAcordos\GAcordos\Views\Contratos\Index.cshtml:line 29
 at System.Web.WebPages.WebPageBase.ExecutePageHierarchy()
 at System.Web.Mvc.WebViewPage.ExecutePageHierarchy()
 at System.Web.WebPages.StartPage.RunPage()
 at System.Web.WebPages.StartPage.ExecutePageHierarchy()
 at System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage)
 at System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance)
 at System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer)
 at System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context)
 at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult)
 at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass1c.<InvokeActionResultWithFilters>b__19()
 at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation)

Что может быть не так?

Ответы [ 2 ]

0 голосов
/ 20 июня 2011

Проблема была не в лямбда-выражениях.Он был вызван при загрузке информации из базы данных, он запрашивал базу данных для связанных таблиц при повторении результата запроса для основной таблицы.

Это было решено добавлением MultipleActiveResultSets = true к части поставщикаСтрока подключения.См. Решение для:

Уже существует открытый DataReader, связанный с этой командой, который должен быть закрыт первым.

0 голосов
/ 17 июня 2011

Очень сложно сказать, но если бы мне пришлось угадывать, я бы сказал, что ваш вызов GetMethod возвращает ноль.

Можете ли вы выделить эту строку во временную переменную и проверить ее значение?

Type.GetType("GAcordos.Helpers.Comparators").GetMethod(oper, new Type[] { propType, propType })

Или, что еще лучше, сделайте небольшое автономное воспроизведение, чтобы люди здесь могли бегать.

...