gpt4 book ai didi

c# - 匹配客户在前端选择的搜索属性

转载 作者:行者123 更新时间:2023-11-30 14:34:49 26 4
gpt4 key购买 nike

我在一个类中有一个方法,允许我根据一组特定的客户指定标准返回结果。该方法将客户在前端指定的内容与来自数据库的集合中的每个项目相匹配。在客户未指定任何属性的情况下,属性的 ID 将传递到等于 0 的方法(数据库在所有表上都有一个身份,该身份以 1 为种子并且是增量的)。在这种情况下,应该忽略该属性,例如,如果客户未指定位置,则 customerSearchCriteria.LocationID = 0 进入该方法。然后匹配将匹配其他属性并返回匹配其他属性的所有位置,示例如下:

public IEnumerable<Pet> FindPetsMatchingCustomerCriteria(CustomerPetSearchCriteria customerSearchCriteria)
{
if(customerSearchCriteria.LocationID == 0)
{
return repository.GetAllPetsLinkedCriteria()
.Where(x => x.TypeID == customerSearchCriteria.TypeID &&
x.FeedingMethodID == customerSearchCriteria.FeedingMethodID &&
x.FlyAblityID == customerSearchCriteria.FlyAblityID )
.Select(y => y.Pet);
}
}

指定所有条件时的代码如下所示:

private PetsRepository repository = new PetsRepository();

public IEnumerable<Pet> FindPetsMatchingCustomerCriteria(CustomerPetSearchCriteria customerSearchCriteria)
{
return repository.GetAllPetsLinkedCriteria()
.Where(x => x.TypeID == customerSearchCriteria.TypeID &&
x.FeedingMethodID == customerSearchCriteria.FeedingMethodID &&
x.FlyAblityID == customerSearchCriteria.FlyAblityID &&
x.LocationID == customerSearchCriteria.LocationID )
.Select(y => y.Pet);
}

我想避免使用一整套if 和 else 语句 来满足每次客户未明确选择他们正在寻找的结果的属性时的需求。实现这一目标的最简洁、最有效的方法是什么?

最佳答案

未选中的条件始终为零,对吗?那么如何获取字段等于条件或条件等于零的行。

这应该可行

private PetsRepository repository = new PetsRepository();

public IEnumerable<Pet> FindPetsMatchingCustomerCriteria(CustomerPetSearchCriteria customerSearchCriteria)
{
return repository.GetAllPetsLinkedCriteria()
.Where(x => (customerSearchCriteria.TypeID == 0 || x.TypeID == customerSearchCriteria.TypeID)&&
(customerSearchCriteria.FeedingMethodID == 0 || x.FeedingMethodID == customerSearchCriteria.FeedingMethodID) &&
(customerSearchCriteria.FlyAblityID == 0 || x.FlyAblityID == customerSearchCriteria.FlyAblityID) &&
(customerSearchCriteria.LocationID == 0 || x.LocationID == customerSearchCriteria.LocationID))
.Select(y => y.Pet);
}

或者,如果这是您发现自己经常做的事情,您可以编写一个替代的 Where 扩展方法,该方法要么应用标准,要么在零时通过,并链接调用而不是调用条件与条件和。然后,您只需在每个查询中对条件 == 0 进行一次比较,而不是对每个不匹配的行进行比较。我不确定它是否值得 - 可能 - 边际性能提升,如果你想要提高性能,你最好在数据库中应用过滤器。
无论如何,它在这里,是为了启迪人心。 . .

static class Extns
{
public static IEnumerable<T> WhereZeroOr<T>(this IEnumerable<T> items, Func<T, int> idAccessor, int id)
{
if (id == 0)
return items;
else
return items.Where(x => idAccessor(x) == id);
}
}

private PetsRepository repository = new PetsRepository();

public IEnumerable<Pet> FindPetsMatchingCustomerCriteria(CustomerPetSearchCriteria customerSearchCriteria)
{
return repository.GetAllPetsLinkedCriteria()
.WhereZeroOr(x => x.TypeID, customerSearchCriteria.TypeID)
.WhereZeroOr(x => x.FeedingMethodID, customerSearchCriteria.FeedingMethodID)
.WhereZeroOr(x => x.FlyAblityID, customerSearchCriteria.FlyAblityID)
.WhereZeroOr(x => x.LocationID, customerSearchCriteria.LocationID);
}

关于c# - 匹配客户在前端选择的搜索属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13329721/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com