C# 如何从C中可能的查询字符串中筛选Lambda表达式#

C# 如何从C中可能的查询字符串中筛选Lambda表达式#,c#,lambda,C#,Lambda,我正在尝试通过查询字符串筛选结果,但不确定最好的方法是什么,到目前为止,我掌握的是: var topic = Request.QueryString["topic"]; var date = Request.QueryString["date"]; var keyword = Request.QueryString["keyword"]; if (!string.IsNullOrEmpty(topic) || !string.IsNullOrEmpty(date) || !string.IsN

我正在尝试通过查询字符串筛选结果,但不确定最好的方法是什么,到目前为止,我掌握的是:

var topic = Request.QueryString["topic"];
var date = Request.QueryString["date"];
var keyword = Request.QueryString["keyword"];

if (!string.IsNullOrEmpty(topic) || !string.IsNullOrEmpty(date) || !string.IsNullOrEmpty(keyword))
{
    items = root.Children().Where(x => x.IsDocumentType("Event-Item") &&
        x.GetPropertyValue("eventTitle").ToString().Contains(topic) || 
        x.GetPropertyValue("eventDates").ToString().Contains(date) || 
        x.GetPropertyValue("eventSummary").ToString().Contains(keyword)).OrderByDescending(x => x.CreateDate).ToList();
}
else
{
    items = root.Children().Where(x => x.IsDocumentType("Event-Item")).OrderByDescending(x => x.CreateDate).ToList();
}
这看起来对吗?有更好(更正确)的方法吗?
非常感谢您的帮助。

我将把它分解如下。您总是在“事件项”上进行筛选,所以将其从if/else中去掉,然后首先进行筛选。然后检查空值,并根据需要进行筛选。最后,因为你总是在分类,所以在做每件事之后都要这样做

    var topic = Request.QueryString["topic"];
    var date = Request.QueryString["date"];
    var keyword = Request.QueryString["keyword"];

    items = root
              .Children()
              .Where(x => x.IsDocumentType("Event-Item"));

    if (!string.IsNullOrEmpty(topic) || !string.IsNullOrEmpty(date) || !string.IsNullOrEmpty(keyword))
    {
        items = items.Where(x =>                    
            x.GetPropertyValue("eventTitle").ToString().Contains(topic) || 
            x.GetPropertyValue("eventDates").ToString().Contains(date) || 
            x.GetPropertyValue("eventSummary").ToString().Contains(keyword));
    }

    items = items.OrderByDescending(x => x.CreateDate);

每个术语的条件
位置如何

string topic = Request.QueryString["topic"];
string date = Request.QueryString["date"];
string keyword = Request.QueryString["keyword"];

var filteredItems = root.Children()
                        .Where(x => x.IsDocumentType("Event-Item"));
if (!string.IsNullOrEmpty(topic))
    filteredItems = filteredItems.Where(x => x.GetPropertyValue("eventTitle")
                                              .ToString()
                                              .Contains(topic));
if (!string.IsNullOrEmpty(date))
    filteredItems = filteredItems.Where(x => x.GetPropertyValue("eventDates")
                                              .ToString()
                                              .Contains(date));
if (!string.IsNullOrEmpty(keyword))
    filteredItems = filteredItems.Where(x => x.GetPropertyValue("eventSummary")
                                              .ToString()
                                              .Contains(keyword));
items = filteredItems.OrderByDescending(x => x.CreateDate).ToList();

与答案无关:您应该将
()
放在where lambda中,以指示是否需要
事件项
(与其他三项中的任何一项一起),或者是否需要
事件项
事件标题
对,或者是另外两项中的任何一项。与答案更相关,检查为什么如果
主题
为空且
日期
不为空,您仍按
主题
进行筛选?如果提供了日期和关键字而不是主题,这是否仍然有效?或者是否提供了主题和关键字,但没有提供日期?因为这些是过滤器参数,所以它将。如果只提供日期和关键字,则只对它们执行过滤(不过滤主题)。如果没有提供任何参数,则根本不执行过滤。刚刚测试过,效果很好,感谢您的帮助,非常感谢