Entity framework core 实体框架核心不适用于select(x=>MyClass(x))

Entity framework core 实体框架核心不适用于select(x=>MyClass(x)),entity-framework-core,Entity Framework Core,下面的Getstring\u日期方法不起作用。我得到以下例外。我知道EFCore非常有限,但这个例外无助于了解问题的确切位置。你能解释一下是什么导致了这个异常吗 An unhandled exception occurred while processing the request. ArgumentException: The given expression 'new EntryViewModel([x])' does not contain the searched expression

下面的Getstring\u日期方法不起作用。我得到以下例外。我知道EFCore非常有限,但这个例外无助于了解问题的确切位置。你能解释一下是什么导致了这个异常吗

An unhandled exception occurred while processing the request.

ArgumentException: The given expression 'new EntryViewModel([x])' does not contain the searched expression '[x]' in a nested NewExpression with member assignments or a MemberBindingExpression.
Parameter name: fullExpression
InvokeMethod

TargetInvocationException: Exception has been thrown by the target of an invocation.
InvokeMethod
EntryController.cs

    [HttpGet("{_date}")]
    public async Task<IEnumerable<EntryViewModel>> Get(string _date)
    {
        DateTime date = DateTime.ParseExact(_date, "dd-MM-yyyy", CultureInfo.InvariantCulture);

        User user = await _userManager.GetUserAsync(HttpContext.User);

        var Entries = _context.Entries.Include(x => x.Budget)
            .Where(x => x.User.Id == user.Id && x.Date >= date && x.Date < date.AddDays(7))
            .Select(x=> new EntryViewModel(x))
            .ToList();

        return Entries;     
    }

您可以尝试如下所示,然后让我们知道结果

var Entries = _context.Entries.Include(x => x.Budget)
                .Where(x => x.User.Id == user.Id && x.Date >= date && x.Date < date.AddDays(7))
                .Select(e=> new EntryViewModel
                  {
                     BudgetId=e.BudgetId,
                     Duration=e.Duration,
                   }).ToList();

您可以尝试如下所示,然后让我们知道结果

var Entries = _context.Entries.Include(x => x.Budget)
                .Where(x => x.User.Id == user.Id && x.Date >= date && x.Date < date.AddDays(7))
                .Select(e=> new EntryViewModel
                  {
                     BudgetId=e.BudgetId,
                     Duration=e.Duration,
                   }).ToList();

这个神秘的异常消息所说的是,在EF中,如果您想使用x来构造一个新对象,它必须是新的C{a=x.B,…}形式,其中C可以省略以投影到一个匿名类型。EF不支持调用包括构造函数在内的任意函数,只支持一些特定的功能,如调用属性设置器。

这个神秘的异常消息的意思是,在EF中,如果要使用x构造新对象,它必须采用新的C{a=x.B,…}其中,可以省略C以投影到匿名类型。EF不支持调用包括构造函数在内的任意函数,只支持某些特定功能,如调用属性设置器。

如果没有写操作,请尝试将AsNoTracking添加到查询中。

如果没有写操作,请尝试将AsNoTracking添加到查询中。因此,以下操作也应该起作用:。其中x=>..ToList.Selectx=>new Cx。。。。但是你的建议比我现在提供的有什么优势吗?因为映射很难看:@Zagoda也可以,但在这种情况下,您可以使用.Where….AsEnumerable.Select。。。避免不必要地创建中间列表。至于新C{A=x.B,…}的一个优点是,EF知道您要使用哪些列,因此它可以在发送到数据库的查询中忽略任何未使用的列。@Zagoda由于性能问题,这不好。如果您在ToList之后进行投影,它发生在从数据库获取数据后的内存上。因此,它会降低ef查询的性能。因此,当我说includex=>x.Budget,但只在select part中使用x.BudgetId时,它不会提取Budgets表的所有列,太好了?@Zagoda错了。它将预算表的所有列作为一个单独的列表,而不是您的预测。我明白了。因此,以下操作也应该起作用:。其中x=>..ToList.Selectx=>new Cx。。。。但是你的建议比我现在提供的有什么优势吗?因为映射很难看:@Zagoda也可以,但在这种情况下,您可以使用.Where….AsEnumerable.Select。。。避免不必要地创建中间列表。至于新C{A=x.B,…}的一个优点是,EF知道您要使用哪些列,因此它可以在发送到数据库的查询中忽略任何未使用的列。@Zagoda由于性能问题,这不好。如果您在ToList之后进行投影,它发生在从数据库获取数据后的内存上。因此,它会降低ef查询的性能。因此,当我说includex=>x.Budget,但只在select part中使用x.BudgetId时,它不会提取Budgets表的所有列,也是?@Zagoda错了。它将预算表的所有列作为一个单独的列表,而不是您的预测。您能检查我在hvd答案的评论部分问了什么吗?您能检查我在hvd答案的评论部分问了什么吗?