在umbraco中构建Linq查询

时间:2013-12-18 20:32:22

标签: c# linq umbraco

我正在使用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个日期。

另外,我确信有一种更简单的方法可以达到这个目的:)

由于 特拉维斯

1 个答案:

答案 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可以包含比较日期的所有逻辑,而不是尝试内联所有的解析/比较。)