我应该为我的实体框架查询捕获哪些错误?

发布于 2025-02-09 14:21:09 字数 5085 浏览 3 评论 0原文

我有一个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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

浪漫之都 2025-02-16 14:21:09

现在,我认为我应该有一些可以抓住的东西
这些查找期间发出的任何错误。

如果您不确定在哪种情况下得到哪些例外,请使用调试器和一些测试代码来找出您实际上可能期望的例外:

// TODO: create one of your error conditions
try
{
   _context.SaveChanges();
}
catch (Exception e)
{
    Console.WriteLine(e.GetType()); // what is the real exception?
}

阅读

Now, I'm thinking I should have something in place which could catch
any errors emitted during these lookups.

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:

// TODO: create one of your error conditions
try
{
   _context.SaveChanges();
}
catch (Exception e)
{
    Console.WriteLine(e.GetType()); // what is the real exception?
}

Read this answer to know more

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文