asp.net-mvc - 将 LINQ to EF 投影到 View 模型时出现异常。获取 "only parameterless constructor and initializers"异常

标签 asp.net-mvc linq entity-framework linq-to-entities

我知道这个问题的变体已经在这里被覆盖了,但看起来我的代码已经与重复标记为答案的内容相匹配。我正在编写一些报告,并利用这种模式制作了许多其他类似的报告,没有出现任何问题。我有一个像这样的 Controller 操作:

public ActionResult Filter(ChecksClearingFilterVM Filter)
        {
            var Result = DataQuery(Filter).Select(a => new ChecksClearingResultVM
            {
                CheckAmount = a.Amount,
                CheckNumber = a.CheckNumber,
                Payee = a.NpoName,
                CheckClearDate = a.CheckClearDate,
                CheckDate = a.CheckDate,
            }).ToList(); 
            Filter.Result = Result;
            return View("ChecksClearingResult", Filter);
        }

这是有问题的 View 模型:

public class ChecksClearingResultVM
    {
        public int? CheckNumber { get; set; }
        public string Payee { get; set; }
        public DateTime CheckDate { get; set; }
        public DateTime? CheckClearDate { get; set; }       
        public decimal CheckAmount { get; set; }       
    }

另一个 View 模型:

public class ChecksClearingFilterVM
    {
        public int BankAccountId { get; set; }
        public SelectList SelectBankAccount { get; set; }
        public DateTime? StartDate { get; set; }
        public DateTime? EndDate { get; set; }
        public IEnumerable<ChecksClearingResultVM> Result { get; set; }
    }

我似乎没有调用任何构造函数,更不用说带参数的构造函数了。它在投影上爆炸。我特别困惑,因为我有一些报告可以很好地使用相同的设计。

也许我的问题是 DataQuery 函数的问题?它看起来是这样的:

 public IQueryable<DistroPayment> DataQuery(ChecksClearingFilterVM Filter)
        {
            var wootz = Tds.DistroPayments
                .Where(b =>
                   b.BankAccountId == Filter.BankAccountId
                   && b.CheckClearDate.HasValue
                   || !b.CheckNumber.HasValue);

            if (Filter.StartDate.HasValue || Filter.StartDate.HasValue)
            {
                if (Filter.StartDate.HasValue)
                {
                    wootz = wootz.Where(x => x.CheckClearDate >= Filter.StartDate);
                }

                if (Filter.EndDate.HasValue)
                {
                    wootz = wootz.Where(x => x.CheckClearDate <= Filter.EndDate);
                }
            }
            else
            {
                wootz = wootz.Where(x => x.CheckClearDate >= new DateTime(DateTime.Now.Year, 1, 1));
            }

            return wootz;
        }

根据要求,这是我的堆栈跟踪。准备文字墙:

<!--

Message: Only parameterless constructors and initializers are supported in LINQ to Entities.
Source: System.Data.Entity
StackTrace:
   at System.Data.Objects.ELinq.ExpressionConverter.NewTranslator.TypedTranslate(ExpressionConverter parent, NewExpression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.UnaryTranslator.TypedTranslate(ExpressionConverter parent, UnaryExpression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.BinaryTranslator.TypedTranslate(ExpressionConverter parent, BinaryExpression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input)
   at System.Data.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input, DbExpressionBinding& binding)
   at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, DbExpression& source, DbExpressionBinding& sourceBinding, DbExpression& lambda)
   at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call)
   at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, SequenceMethod sequenceMethod)
   at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, DbExpression& source, DbExpressionBinding& sourceBinding, DbExpression& lambda)
   at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SelectTranslator.Translate(ExpressionConverter parent, MethodCallExpression call)
   at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, SequenceMethod sequenceMethod)
   at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.Convert()
   at System.Data.Objects.ELinq.ELinqQueryState.GetExecutionPlan(Nullable`1 forMergeOption)
   at System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)
   at System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator()
   at System.Data.Entity.Internal.Linq.InternalQuery`1.GetEnumerator()
   at System.Data.Entity.Infrastructure.DbQuery`1.System.Collections.Generic.IEnumerable<TResult>.GetEnumerator()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at TDS.UI.Controllers.ChecksClearingController.Filter(ChecksClearingFilterVM Filter) in C:\Users\gbisaccia.CREATEHOPE\Documents\Visual Studio 2010\Projects\TruistConnect\DEVELOPMENT\TruistConnect\TDS.UI\Controllers\ChecksClearingController.cs:line 59
   at lambda_method(Closure , ControllerBase , Object[] )
   at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
   at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
   at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12()
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation)
   at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15.<>c__DisplayClass17.<InvokeActionMethodWithFilters>b__14()
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation)
   at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15.<>c__DisplayClass17.<InvokeActionMethodWithFilters>b__14()
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation)
   at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15.<>c__DisplayClass17.<InvokeActionMethodWithFilters>b__14()
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation)
   at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15.<>c__DisplayClass17.<InvokeActionMethodWithFilters>b__14()
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation)
   at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15.<>c__DisplayClass17.<InvokeActionMethodWithFilters>b__14()
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
   at System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName)

-->

最佳答案

wootz = wootz.Where(x => x.CheckClearDate >= new DateTime(DateTime.Now.Year, 1, 1));

这看起来不对。 Entity Framework 不理解此构造函数。您应该能够通过将其设置为参数来修复此部分:

var startOfYear = new DateTime(DateTime.Now.Year, 1, 1);
wootz = wootz.Where(x => x.CheckClearDate >= startOfYear);

搜索还会显示EntityFunctions.CreateDateTime作为替代方案。

(注意:我还没有检查这是否是唯一的问题。)

关于asp.net-mvc - 将 LINQ to EF 投影到 View 模型时出现异常。获取 "only parameterless constructor and initializers"异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11994937/

相关文章:

c# - web.config 中的 Oracle 连接字符串抛出错误

.net - 在 .NET 框架中强制使用英语语言异常

c# - 将多个条件传递给 LINQ FirstOrDefault 方法

entity-framework - 保存到数据库时,EF 6 位小数被删除

asp.net - 更新记录属性后,EF 有时会在 SaveChanges() 上抛出 NullReferenceException

c# - Linq 方法有问题

asp.net-mvc - 使用 Html.BeginForm 时如何使用 anchor 标记提交?

c# - 如何在mvc中将复杂的键值参数从 View 传递到 Controller ?

c# - 使用 IDbConnection.Query() 返回 IEnumerable 时,AsList() 是否比 ToList() 更好?

c# - 在 Entity Framework 6 中使用 Effort 的正确方法是什么?