EF:函数正确计算,而 Lambda 表达式引发错误



我最初尝试使用 Lambda 表达式来计算下面的 SingleOrDefault 函数,但我一直得到(无法创建类型为"MVC_tutorial的常量值。模特.电影'。在此上下文中仅支持基元类型或枚举类型(错误。然后,我用实际函数替换了 Lambda,突然错误消失了,函数被正确评估。就我目前的理解而言,lambda 应该完全等同于检查器函数,但这种理解现在已毁于一旦。谁能解释为什么一个有效,另一个无效?

[HttpPost] 
public IHttpActionResult RentMovie(NewRentalDTO newRentalDTO)
{
try
{
var customer = _context.Customers.Single(c => c.Id == newRentalDTO.CustomerId);
var movieList = _context.Movies.Where(c => newRentalDTO.MovieIds.Contains(c.Id)).ToList();
foreach (Movie movie in movieList)
{
var rental = new Rental()
{
DateRented = DateTime.Now,
Movie = movie,
Customer = customer
};
_context.Rentals.Add(rental);
bool checker(Movie film)
{
return movie == film;
}
//lambda equivalent used in place of checker: c => c==movie
var movieInDB = _context.Movies.SingleOrDefault(checker);
var result = (movie == movieInDB);
//movieInDB.NumberAvailable--;
}
_context.SaveChanges();
return Ok();
}
catch (System.NotSupportedException e)
{
Console.WriteLine(e);
throw;
}
}

使用该函数将付出很大的性能损失。查询必须检索所有对象并进行比较。

如果您使用 lambda 但仅按 Id 进行比较,则可以将其转换为仅检查基于 Id 的匹配项的查询,而不会将所有电影加载到内存中。

最新更新