我应该为我的实体框架查询捕获哪些错误?
我有一个ASP.NET Core MVC应用程序(在.NET 6上运行),其中有一些客户的数据库。
应用程序的目的只是让用户输入一堆限制,这些约束将过滤数据库中的客户,并返回过滤后的客户列表,然后将其显示给用户。
我有一个控制器操作,它接受了约束查询,看起来像这样:
[HttpPost]
public async Task<IActionResult> Query(QueryModel query)
{
var customers = await _context.Customers.AsQueryable().FilterCustomerList(query);
ViewBag.Name = query.Name;
ViewBag.Age = query.Age;
ViewBag.SalesPersonName = query.salespersonName;
return View("Index", customers);
}
然后,此功能正在过滤客户:
public static async Task<List<CustomerModel>> FilterCustomerList(this IQueryable<CustomerModel> customersQuery, QueryModel query)
{
customersQuery = customersQuery
.Include(x => x.Adress)
.Include(x => x.purchases).ThenInclude(x => x.Car)
.Include(x => x.purchases).ThenInclude(x => x.SalesPerson.Adress)
.Where(query.Name != default, x => x.Name.Equals(query.Name))
.Where(query.Surname != default, x => x.Surname.Equals(query.Surname))
.Where(query.Age != default, x => x.Age.Equals(query.Age))
.Where(query.Country != default, x => x.Adress.Country.Equals(query.Country))
.Where(query.Town != default, x => x.Adress.Town.Equals(query.Town))
.Where(query.ZipCode != default, x => x.Adress.ZipCode.Equals(query.ZipCode))
.Where(query.Street != default, x => x.Adress.street.Equals(query.Street))
.Where(query.HouseNr != default, x => x.Adress.HouseNumber.Equals(query.HouseNr))
.Where(query.To != query.From, x => x.Created > query.From && x.Created < query.To)
.Where(query.purchaseDateFrom != query.purchaseDateTo, x => x.purchases.Any(
x => x.OrderDate > query.purchaseDateFrom && x.OrderDate < query.purchaseDateTo))
.Where(query.model != default, x => x.purchases.Any(p => p.Car.Model.Equals(query.model)))
.Where(query.make != default, x => x.purchases.Any(p => p.Car.Make.Equals(query.make)))
.Where(query.color != default, x => x.purchases.Any(p => p.Car.CarColor == query.color))
.Where(query.paidPrice != default, x => x.purchases.Any(p => p.PricePaid.Equals(query.recPrice)))
.Where(query.recPrice != default,
x => x.purchases.Any(p => p.Car.RecommendedPrice.Equals(query.recPrice)))
.Where(query.recPriceLow != default && query.recPriceTop != default, x
=> x.purchases.Any(p =>
p.Car.RecommendedPrice > query.recPriceLow && p.Car.RecommendedPrice < query.recPriceTop))
.Where(query.paidPriceTop != default && query.paidPriceLow != default, x
=> x.purchases.Any(p => p.PricePaid > query.paidPriceLow && p.PricePaid < query.paidPriceTop))
.Where(query.salespersonName != default,
c => c.purchases.Any(p => p.SalesPerson.Name.Equals(query.salespersonName)))
.Where(query.salespersonJobTitle != default,
c => c.purchases.Any(x => x.SalesPerson.JobTitle == query.salespersonJobTitle))
.Where(query.salesPersonSalary != default, c => c.purchases.Any(x => query.salesPersonSalary.Equals(x
.SalesPerson.Salary)))
.Where(query.salesPersonSalaryFrom != default && query.salesPersonSalaryFrom != default, c =>
c.purchases.Any(x => x.SalesPerson.Salary < query.salesPersonSalaryFrom &&
x.SalesPerson.Salary > query.salesPersonSalaryTo))
.Where(query.SalesPersonCountry != default,
c => c.purchases.Any(x => x.SalesPerson.Adress.Country.Equals(query.SalesPersonCountry)))
.Where(query.SalesPersonTown != default,
c => c.purchases.Any(x => x.SalesPerson.Adress.Town.Equals(query.SalesPersonTown)))
.Where(query.SalesPersonZipCode != default, c => c.purchases.Any(x =>
x.SalesPerson.Adress.ZipCode.Equals(query.ZipCode)))
.Where(query.SalesPersonStreet != default, c => c.purchases.Any(x =>
x.SalesPerson.Adress.street.Equals(query.SalesPersonStreet)))
.Where(query.salesPersonHouseNr != default, c => c.purchases.Any(x =>
x.SalesPerson.Adress.HouseNumber.Equals(query.salesPersonHouseNr)));
switch (query.sortBy)
{
case SortBy.Age_desc:
{
customersQuery = customersQuery.OrderByDescending(c => c.Age);
break;
}
case SortBy.CreationDate_desc:
{
customersQuery = customersQuery.OrderByDescending(c => c.Created);
break;
}
case SortBy.Age_asc:
{
customersQuery = customersQuery.OrderBy(c => c.Age);
break;
}
case SortBy.CreationDate_asc:
{
customersQuery = customersQuery.OrderBy(c => c.Created);
break;
}
}
var customers = await customersQuery
.ToListAsync();
return customers;
}
这只是条款中的一个很长的块。
现在,我认为我应该有一些问题,这些东西可能会发现这些查找过程中发出的任何错误。
我真的无法弄清楚当我只做查找时,我可能会期望哪种例外,也无法弄清楚如何挑衅,所以我可以找出答案。
另外,我希望能够与控制器通信发生了错误,并且应该显示明智的错误。
最佳/最正常的练习是要投掷错误并显示一些标准错误页面,还是可以让控制器操作处理错误?
I have an ASP.NET Core MVC application (running on .NET 6), where I have a database of some customers.
The purpose of the application is simply to let a user input a bunch of constraints that will filter the customers in the database, and return the filtered list of customers, and then display them to the user.
I have a controller action, which accepts the constraints query, and it looks like this:
[HttpPost]
public async Task<IActionResult> Query(QueryModel query)
{
var customers = await _context.Customers.AsQueryable().FilterCustomerList(query);
ViewBag.Name = query.Name;
ViewBag.Age = query.Age;
ViewBag.SalesPersonName = query.salespersonName;
return View("Index", customers);
}
and then this function is filtering the customers:
public static async Task<List<CustomerModel>> FilterCustomerList(this IQueryable<CustomerModel> customersQuery, QueryModel query)
{
customersQuery = customersQuery
.Include(x => x.Adress)
.Include(x => x.purchases).ThenInclude(x => x.Car)
.Include(x => x.purchases).ThenInclude(x => x.SalesPerson.Adress)
.Where(query.Name != default, x => x.Name.Equals(query.Name))
.Where(query.Surname != default, x => x.Surname.Equals(query.Surname))
.Where(query.Age != default, x => x.Age.Equals(query.Age))
.Where(query.Country != default, x => x.Adress.Country.Equals(query.Country))
.Where(query.Town != default, x => x.Adress.Town.Equals(query.Town))
.Where(query.ZipCode != default, x => x.Adress.ZipCode.Equals(query.ZipCode))
.Where(query.Street != default, x => x.Adress.street.Equals(query.Street))
.Where(query.HouseNr != default, x => x.Adress.HouseNumber.Equals(query.HouseNr))
.Where(query.To != query.From, x => x.Created > query.From && x.Created < query.To)
.Where(query.purchaseDateFrom != query.purchaseDateTo, x => x.purchases.Any(
x => x.OrderDate > query.purchaseDateFrom && x.OrderDate < query.purchaseDateTo))
.Where(query.model != default, x => x.purchases.Any(p => p.Car.Model.Equals(query.model)))
.Where(query.make != default, x => x.purchases.Any(p => p.Car.Make.Equals(query.make)))
.Where(query.color != default, x => x.purchases.Any(p => p.Car.CarColor == query.color))
.Where(query.paidPrice != default, x => x.purchases.Any(p => p.PricePaid.Equals(query.recPrice)))
.Where(query.recPrice != default,
x => x.purchases.Any(p => p.Car.RecommendedPrice.Equals(query.recPrice)))
.Where(query.recPriceLow != default && query.recPriceTop != default, x
=> x.purchases.Any(p =>
p.Car.RecommendedPrice > query.recPriceLow && p.Car.RecommendedPrice < query.recPriceTop))
.Where(query.paidPriceTop != default && query.paidPriceLow != default, x
=> x.purchases.Any(p => p.PricePaid > query.paidPriceLow && p.PricePaid < query.paidPriceTop))
.Where(query.salespersonName != default,
c => c.purchases.Any(p => p.SalesPerson.Name.Equals(query.salespersonName)))
.Where(query.salespersonJobTitle != default,
c => c.purchases.Any(x => x.SalesPerson.JobTitle == query.salespersonJobTitle))
.Where(query.salesPersonSalary != default, c => c.purchases.Any(x => query.salesPersonSalary.Equals(x
.SalesPerson.Salary)))
.Where(query.salesPersonSalaryFrom != default && query.salesPersonSalaryFrom != default, c =>
c.purchases.Any(x => x.SalesPerson.Salary < query.salesPersonSalaryFrom &&
x.SalesPerson.Salary > query.salesPersonSalaryTo))
.Where(query.SalesPersonCountry != default,
c => c.purchases.Any(x => x.SalesPerson.Adress.Country.Equals(query.SalesPersonCountry)))
.Where(query.SalesPersonTown != default,
c => c.purchases.Any(x => x.SalesPerson.Adress.Town.Equals(query.SalesPersonTown)))
.Where(query.SalesPersonZipCode != default, c => c.purchases.Any(x =>
x.SalesPerson.Adress.ZipCode.Equals(query.ZipCode)))
.Where(query.SalesPersonStreet != default, c => c.purchases.Any(x =>
x.SalesPerson.Adress.street.Equals(query.SalesPersonStreet)))
.Where(query.salesPersonHouseNr != default, c => c.purchases.Any(x =>
x.SalesPerson.Adress.HouseNumber.Equals(query.salesPersonHouseNr)));
switch (query.sortBy)
{
case SortBy.Age_desc:
{
customersQuery = customersQuery.OrderByDescending(c => c.Age);
break;
}
case SortBy.CreationDate_desc:
{
customersQuery = customersQuery.OrderByDescending(c => c.Created);
break;
}
case SortBy.Age_asc:
{
customersQuery = customersQuery.OrderBy(c => c.Age);
break;
}
case SortBy.CreationDate_asc:
{
customersQuery = customersQuery.OrderBy(c => c.Created);
break;
}
}
var customers = await customersQuery
.ToListAsync();
return customers;
}
Which is just a very long block of where clauses.
Now, I'm thinking I should have something in place which could catch any errors emitted during these lookups.
I can't really figure out which exception I might expect when I am only doing lookups though, and can't figure out how to provoke any either, so I could find out.
Also, I would like to be able to communicate to my controller that an error has happened, and that an sensible error should be displayed.
Would the best/most normal practice, just be to throw the error and have some standard error page show, or could I let the controller action handle the error?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
如果您不确定在哪种情况下得到哪些例外,请使用调试器和一些测试代码来找出您实际上可能期望的例外:
阅读
If you are not certain which exceptions you get in what situations, use your debugger and some test code to find out which exceptions you actually may expect:
Read this answer to know more