我在我的搜索逻辑中有以下代码,它引用了一个遗留数据库,其中我可以匹配搜索的唯一方法是表行名称,Level-1,Level-2等。
if (criteria.Levels.Contains("Level-1", StringComparer.CurrentCultureIgnoreCase))
{
var filteredResult = allCachedItems
.Where(x => !string.IsNullOrEmpty(x.Level1));
resultsSet.AddRange(filteredResult.Except(resultsSet));
}
if (criteria.Levels.Contains("Level-2", StringComparer.CurrentCultureIgnoreCase))
{
var filteredResult = allCachedItems
.Where(x => !string.IsNullOrEmpty(x.Level2));
resultsSet.AddRange(filteredResult.Except(resultsSet));
}
if (criteria.Levels.Contains("Level-3", StringComparer.CurrentCultureIgnoreCase))
{
var filteredResult = allCachedItems
.Where(x => !string.IsNullOrEmpty(x.Level3));
resultsSet.AddRange(filteredResult.Except(resultsSet));
}
字符串
显然,这看起来很可怕,而且是重复的代码,所以我想创建一个可以接受字符串的方法,例如“Level-1”和某种委托来确定模型上的哪些属性要测试。
或者用一种更干净的方式来过滤我的“allCachedItems”集合。
该表具有多个名为级别{X}的列,每个列在适合记录的地方包含一些文本,在不适合的地方为空。
搜索表单以“Level-{x}"格式传递纯文本。
2条答案
按热度按时间xpcnnkqh1#
给予这个一个裂缝:
字符串
或者,如果
resultsSet
最初为空:型
或者,如果你想要两者的结合:
型
或者这是对重复的终极打击。
型
mefy6pfw2#
所以我想创建一个方法,它可以接受一个字符串,例如“Level-1”和某种委托来确定模型上的哪些属性要测试。
你可以像这样创建一个本地函数:
字符串
其中
X
是allCachedItems
中的项目类型。还可以考虑使用
Dictionary<int, Func<X, string?>>
来记录级别和属性之间的Map:型
这样,
AddLevelToResultSet
只需要level
参数。levelProperty
可以用mapping[level]
计算。或者用一种更干净的方式来过滤我的
allCachedItems
集合。如果
allCachedItems
是一个普通的集合(与IQueryable
相反),并且所有的级别都是不相交的,那么你可以在一个Where
中做到这一点,其中所有的级别都与||
相连。型