C# 在umbraco中构建Linq查询

C# 在umbraco中构建Linq查询,c#,linq,umbraco,C#,Linq,Umbraco,我正在使用Umbraco的uQuery在C#中构建一个web服务,它接受2个参数并返回一个包含搜索结果列表的JSON序列化字符串 我传入一个字符串数组,其中包含用于搜索的标记,例如:[“红色”、“蓝色”] 公共字符串GetResultsHttp(字符串[]标记) { 可数节点; //首先获取所有内容类型正确的节点 nodes=uQuery.GetNodesByType(“MyPage”); //如果传入了标记,则将结果限制为这些标记 如果(tags.Length>0) { 节点=节点。其中(n=

我正在使用Umbraco的uQuery在C#中构建一个web服务,它接受2个参数并返回一个包含搜索结果列表的JSON序列化字符串

我传入一个字符串数组,其中包含用于搜索的标记,例如:[“红色”、“蓝色”]

公共字符串GetResultsHttp(字符串[]标记)
{
可数节点;
//首先获取所有内容类型正确的节点
nodes=uQuery.GetNodesByType(“MyPage”);
//如果传入了标记,则将结果限制为这些标记
如果(tags.Length>0)
{
节点=节点。其中(n=>tags.Contains(n.Parent.GetProperty(“tags”).Value));
}
//以序列化字符串的形式返回节点列表
}
到目前为止还不错,它可以返回包含我的任何标记的结果

现在我想按日期限制结果。dates数组看起来像这样[“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

}
公共字符串GetResultsHttp(字符串[]标记,字符串[]日期)
{
可数节点;
//首先获取所有内容类型正确的节点
nodes=uQuery.GetNodesByType(“MyPage”);
//如果传入了标记,则将结果限制为这些标记
如果(tags.Length>0)
{
节点=节点。其中(n=>tags.Contains(n.Parent.GetProperty(“tags”).Value));
}
如果(dates.Length>0)
{
//传入日期的格式
字符串格式字符串=“yyyyMM”;
foreach(日期中的字符串日期标记)
{
DateTime dt=DateTime.ParseExact(日期标记,格式字符串,null);
节点=节点,其中(n=>(dt.Month.Equals(n.GetProperty(“myDate”).Month))&(dt.Year.Equals(n.GetProperty(“myDate”).Year));
}
}
//以序列化字符串的形式返回节点列表
}
显然,上面提到的一个日期可以很好地使用,但是如果我通过了2个日期,那么一个页面就不能有2个日期

此外,我相信有一种更简单的方法可以实现这一点:)

谢谢
Travis

目前,您的查询正在确保日期等于
日期中的所有日期。您希望它在
日期
中过滤任何日期的
位置

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"));
var nodes=uQuery.GetNodesByType(“MyPage”)
.Where(n=>tags.Contains(n.Parent.GetProperty(“tags”).Value)
.Where(n=>dates.Any(dateString=>
DatesReequal(dateString,n.GetProperty(“myDate”);
DatesAreEqual
可以包含用于比较日期的所有逻辑,而不是尝试内联所有解析/比较。)

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"));