我有一个不好的要求;无论如何,我必须在我的申请中实现它。
我有Track
班
public class Track
{
public string Name { get; set; }
public string City { get; set; }
public string Country { get; set; }
}
我有一些测试数据
List<Track> Records = new List<Track>
{
new Track { City = "a", Name = "a", Country = "i" }, // Track 1
new Track { City = "b", Name = "b", Country = "i" }, // Track 2
new Track { City = "a", Name = null, Country = "J" }, // Track 3
new Track { City = "c", Name = "a", Country = "J" }, // Track 4
new Track { City = "b", Name = "a", Country = null}, // Track 5
};
要求是我应该根据传递的值查询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
Name
&amp; Country
和Track 3
中的Track 5
空值var filterRecords = new List<Track>();
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
LINQ
类有12个属性。像上面那样检查12次并不是好兆头。
我想通过使用{{1}}或任何其他简单的方法来实现这一点。
有什么建议吗?。
答案 0 :(得分:5)
我想到的最佳解决方案是构建聚合过滤器(您可以使用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。然后只需将过滤器应用于您的记录:
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;
答案 1 :(得分:0)
您可以轻松地将这些表达式链接在一起,以创建如下所示的内容。枚举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行代码,还有更复杂的解决方案涉及反射和映射,但在这种情况下并不是真的需要。如果您的财产数量巨大,那么也许它可能是值得的。但是12个属性足够小,以至于我没有太多的代码味道。
答案 2 :(得分:0)
如果我理解,应该这么简单:
var results = Records.Select(p => p.City != null &&
p.Country != null &&
p.Name != null).ToList();
答案 3 :(得分:0)
返回的结果质量和数量对您而言? 我假设你有处理数量的机制。
您可以在投掷查询之前验证搜索关键字。你只关心空值吗?冗余关键字怎么样? 我会考虑: 1.验证关键字 - 12可以循环。 2.构建强大的搜索关键字 3.拍摄查询
看起来很简单,除非它比你在这里描述的更多。
如果我对你的问题的理解不符合预期的方向,请记录我。
答案 4 :(得分:-1)
类似这样的事情
var listRecords = from track in Records
where (track.city == _city && !string.IsEmpyOrNull(track.city)) &&
(track.Name== _name && !string.IsEmpyOrNull(track.Name))
select track;
您可以添加其余条件