我正在使用Umbraco的uQuery在C#中构建一个Web服务,它接受2个参数并返回一个包含搜索结果列表的JSON序列化字符串。
我传入一个包含搜索标签的字符串数组,例如[“红色”,“蓝色”]
public string GetResultsHttp(string[] tags)
{
IEnumerable<Node> nodes;
// first get all nodes that are of the right content type
nodes = uQuery.GetNodesByType("MyPage");
// if tags are passed in then limit the results to those tags
if (tags.Length > 0)
{
nodes = nodes.Where(n => tags.Contains(n.Parent.GetProperty("tags").Value));
}
// return the node list as a serialized string
}
到目前为止一直很好,并且可以返回包含任何标签的结果。
现在我想按日期限制结果。日期数组看起来像这样[“201410”,“201411”]所以它的年份接着是月份。
我想进一步将结果集限制为具有myDate属性的结果,其中月份和年份与我的日期数组中的任何月份和年份匹配。
所以我的代码变成了这个:
public string GetResultsHttp(string[] tags, string[] dates)
{
IEnumerable<Node> nodes;
// first get all nodes that are of the right content type
nodes = uQuery.GetNodesByType("MyPage");
// if tags are passed in then limit the results to those tags
if (tags.Length > 0)
{
nodes = nodes.Where(n => tags.Contains(n.Parent.GetProperty("tags").Value));
}
if (dates.Length > 0)
{
// the format of the incoming date
string formatString = "yyyyMM";
foreach (string dateTag in dates)
{
DateTime dt = DateTime.ParseExact(dateTag, formatString, null);
nodes = nodes.Where(n => (dt.Month.Equals(n.GetProperty<DateTime>("myDate").Month)) && (dt.Year.Equals(n.GetProperty<DateTime>("myDate").Year)));
}
}
// return the node list as a serialized string
}
上述情况显然适用于1个日期,但如果我传入2,则说明一个页面不能有2个日期。
另外,我确信有一种更简单的方法可以达到这个目的:)
由于 特拉维斯
答案 0 :(得分:1)
目前,您的查询是确保日期等于dates
中日期的所有。您希望它过滤Any
中日期dates
的位置。
var nodes= uQuery.GetNodesByType("MyPage")
.Where(n => tags.Contains(n.Parent.GetProperty("tags").Value)
.Where(n => dates.Any(dateString =>
DatesAreEqual(dateString, n.GetProperty<DateTime>("myDate"));
(DatesAreEqual
可以包含比较日期的所有逻辑,而不是尝试内联所有的解析/比较。)