如何忽略搜索条件中的null属性
我有一个不好的要求; 无论如何,我必须在我的应用程序中实现它。
我有一个Track
课程
public class Track { public string Name { get; set; } public string City { get; set; } public string Country { get; set; } }
我有一些测试数据
List
要求是我应该根据传递的值查询Records
的数据。 如果任何属性为null
则搜索条件应忽略该属性。 它应该基于NonNull
属性进行查询。
示例 :
If i query for City = a, Name = "b", Country = "i" then Result is: Track 1 & Track 3 If i query for City = c, Name = "p", Country = "w" then Result is: Track 4
“ Track 3
和“ Track 5
Name
和Country
都具有空值。因此,它将在搜索中忽略。 希望很清楚
我终于以低于逻辑的方式登陆了
var filterRecords = new List(); if (!Records.Any(t => string.IsNullOrWhiteSpace(t.City))) { filterRecords = Records.Where(c => c.City == _city).ToList(); // Here _city is the method parameter.. assume "a" } if (!Records.Any(t => string.IsNullOrWhiteSpace(t.Country))) { filterRecords = filterRecords.Where(c => c.City == _country).ToList(); // Here _country is the method parameter.. assume "c" }
Track
类有12个属性。 像上面那样检查12次并不是好兆头。 我想通过使用LINQ
或任何其他简单的方法来实现这一点。
有什么建议吗?
我想到的最佳解决方案是构建聚合filter(您可以使用Track对象,因为它已经具有过滤集合的所有可能属性,并且它们可以为空):
Track filter = records.Aggregate( new Track() { City = _city, Country = _country, Name = _name }, (f, t) => new Track() { City = String.IsNullOrEmpty(t.City) ? null : f.City, Country = String.IsNullOrEmpty(t.Country) ? null : f.Country, Name = String.IsNullOrEmpty(t.Name) ? null : f.Name }, f => f);
这将只需要对集合进行一次迭代来定义哪些字段为null。 然后只需将filter应用于您的记录:
var query = from t in Records where (filter.City == null || t.City == filter.City) && (filter.Country == null || t.Country == filter.Country) && (filter.Name == null || t.Name == filter.Name) select t;
您可以轻松地将这些表达式链接在一起,以创建如下所示的内容 枚举X次记录将减慢您的代码速度。 例:
var actualResult = Records .Where(x => x.City == _city || string.IsNullOrEmpty(x.City)) .Where(x => x.Country == _country || string.IsNullOrEmpty(x.Country)) /// .... and so on .ToList()
现在,如果您不仅要编写12行代码,还有更复杂的解决方案涉及reflection和映射,但在这种情况下并不是真的需要。 如果您的财产数量巨大,那么也许它可能是值得的。 但是12个属性足够小,以至于我的代码味道不多。
如果我理解,那应该是这么简单:
var results = Records.Select(p => p.City != null && p.Country != null && p.Name != null).ToList();
返回的结果的质量和数量对您有用吗? 我假设你有处理数量的机制。
您可以在投掷查询之前validation搜索关键字。 你只关心空值吗? 冗余关键字怎么样? 我会考虑:1。validation关键字 – 12可以循环。 2.构建强大的搜索关键字3.拍摄查询
看起来很简单,除非它比你在这里描述的更多。
如果我对你的问题的理解不符合预期的方向,请记录我。
这样的事情
var listRecords = from track in Records where (track.city == _city && !string.IsEmpyOrNull(track.city)) && (track.Name== _name && !string.IsEmpyOrNull(track.Name)) select track;
并且您可以添加其余条件
上述就是C#学习教程:如何忽略搜索条件中的null属性分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/936634.html