C# 如何使用lambda表达式实现具有多个筛选器的数据库记录搜索方法

C# 如何使用lambda表达式实现具有多个筛选器的数据库记录搜索方法,c#,linq,lambda,C#,Linq,Lambda,我正在尝试在db记录上实现一个带有多个过滤器的搜索方法 下面的代码工作正常,但当其中一个过滤器为nulla时: NullReferenceException …发生 var user = model.Username != null ? await UserManager.FindByNameAsync(model.Username) : null; res = DB.UserWatchActivityLogs.Where(x => x.User_Id == (user != null ?

我正在尝试在db记录上实现一个带有多个过滤器的搜索方法

下面的代码工作正常,但当其中一个过滤器为
null
a时:

NullReferenceException

…发生

var user = model.Username != null ? await UserManager.FindByNameAsync(model.Username) : null;
res = DB.UserWatchActivityLogs.Where(x => x.User_Id == (user != null ? user.Id : x.User_Id) &&
x.Tutorial.Title.Contains(model.TutorialName ?? "") &&
x.DateTime >= (model.DateTimeFrom != null ? DateTime.Parse(model.DateTimeFrom, new CultureInfo("fa-IR")) : x.DateTime) &&
x.DateTime <= (model.DateTimeTo != null ? DateTime.Parse(model.DateTimeTo, new CultureInfo("fa-IR")) : x.DateTime))
        .Include(x => x.User).Include(x => x.Tutorial).ToList();

var user=model.Username!=无效的wait UserManager.FindByNameAsync(model.Username):null;
res=DB.UserWatchActivityLogs.Where(x=>x.User\u Id==(User!=null?User.Id:x.User\u Id)&&
x、 Tutorial.Title.Contains(model.TutorialName??“”)&&
x、 DateTime>=(model.DateTimeFrom!=null?DateTime.Parse(model.DateTimeFrom,新文化信息(“fa-IR”):x.DateTime)&&
x、 包含(x=>x.Tutorial).ToList();

Linq延迟查询的执行,直到结果实现。当对集合进行迭代或对结果调用
ToList()
时,会发生这种情况

您可以将linq查询链接在一起,直到您想要实现结果集为止。在将筛选器应用于查询之前,请检查筛选器是否为空

请参见下面的想法,希望您能够根据自己的需要进行调整:

var user = model.Username != null ? await UserManager.FindByNameAsync(model.Username) : null;

var res = DB.UserWatchActivityLogs.Include(x => x.User).Include(x => x.Tutorial);

// filter by Id if user is not null
if (user != null)
{
    res = res.Where(x => x.User_Id == user.Id);
}

// filter by tutorial name if it is not null
if (!string.IsNullOrEmpty(model.TutorialName))
{
    res = res.Where(x => x.Tutorial.Title.Contains(model.TutorialName);
}

// filter by date from (assuming model.DateTimeFrom is a string)
if (DateTime.TryParse(model.DateTimeFrom, new CultureInfo("fa-IR"), DateTimeStyles.None, out DateTime dateFrom))
{
    res = res.Where(x.DateTime >= dateFrom);
}

if (DateTime.TryParse(model.DateTimeTo, new CultureInfo("fa-IR"), DateTimeStyles.None, out DateTime dateTo))
{
    res = res.Where(x.DateTime <= dateTo);
}

// materialise the results in a list, this is when the query is executed
var results = res.ToList();
var user=model.Username!=无效的wait UserManager.FindByNameAsync(model.Username):null;
var res=DB.UserWatchActivityLogs.Include(x=>x.User).Include(x=>x.Tutorial);
//如果用户不为null,则按Id筛选
如果(用户!=null)
{
res=res.Where(x=>x.User\u Id==User.Id);
}
//按教程名称筛选(如果不为空)
如果(!string.IsNullOrEmpty(model.TutorialName))
{
res=res.Where(x=>x.Tutorial.Title.Contains(model.TutorialName);
}
//按日期从筛选(假设model.DateTimeFrom是字符串)
if(DateTime.TryParse(model.DateTimeFrom,new-CultureInfo(“fa-IR”),datetimestyle.None,out-DateTime-dateFrom))
{
res=res.Where(x.DateTime>=dateFrom);
}
if(DateTime.TryParse(model.DateTimeTo,new-CultureInfo(“fa-IR”),datetimestyle.None,out-DateTime-dateTo))
{

res=res.Where(x.DateTime是user.Id还是x.user_Id等于null?