Entity framework core 实体框架核心不适用于select(x=>MyClass(x))
下面的Getstring\u日期方法不起作用。我得到以下例外。我知道EFCore非常有限,但这个例外无助于了解问题的确切位置。你能解释一下是什么导致了这个异常吗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
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答案的评论部分问了什么吗?