C# 实体框架使用空变量进行多搜索?

C# 实体框架使用空变量进行多搜索?,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我想搜索多个并获得结果。我发送此函数devicename用户报警。当这些变量被填充时,它就工作了。但当他们是空的,它不是。我只能填写devicename变量。比如, devicename = "test"; alarm=""; user=""; 有时我可以填写devicename用户,有时我可以填写devicename报警。。我无法从代码中获取任何数据。我需要帮助。这是我的密码: List<ActivityLog> list = db.ActivityLog.Where(c =

我想搜索多个并获得结果。我发送此函数
devicename
用户
报警
。当这些变量被填充时,它就工作了。但当他们是空的,它不是。我只能填写
devicename
变量。比如,

devicename = "test"; 
alarm=""; 
user="";
有时我可以填写
devicename
用户
,有时我可以填写
devicename
报警
。。我无法从代码中获取任何数据。我需要帮助。这是我的密码:

List<ActivityLog> list = db.ActivityLog.Where(c => c.Devices.devName.ToLower().Contains(devicename.ToLower()))
                                       .Where(c => c.Users.uName.ToLower().Contains(user.ToLower()))
                                       .Where(c => c.AlarmCodes.aName.ToLower().Contains(alarm.ToLower()))
                                       .OrderBy(c => c.dateTime).Skip(skip).Take(pageSize).ToList();
List List=db.ActivityLog.Where(c=>c.Devices.devName.ToLower().Contains(devicename.ToLower()))
.Where(c=>c.Users.uName.ToLower().Contains(user.ToLower()))
.Where(c=>c.AlarmCodes.aName.ToLower().Contains(alarm.ToLower()))
.OrderBy(c=>c.dateTime).Skip(Skip).Take(pageSize).ToList();

你能把所有这些都放在一个单独的位置吗?它们之间有条件吗?就像这样,它的行为就像是一场战争和一场战争

.ActivityLog.Where(c => c.Devices.devName.ToLower().Contains(devicename.ToLower()) ||
                       c.Users.uName.ToLower().Contains(user.ToLower()) || 
                       c.AlarmCodes.aName.ToLower().Contains(alarm.ToLower()))
             .OrderBy(c => c.dateTime).Skip(skip).Take(pageSize).ToList();

你能把所有这些放在一个单独的位置吗?它们之间有条件吗?就像这样,它的行为就像是一场战争和一场战争

.ActivityLog.Where(c => c.Devices.devName.ToLower().Contains(devicename.ToLower()) ||
                       c.Users.uName.ToLower().Contains(user.ToLower()) || 
                       c.AlarmCodes.aName.ToLower().Contains(alarm.ToLower()))
             .OrderBy(c => c.dateTime).Skip(skip).Take(pageSize).ToList();

我过去也这样做过

public IQueryable<ActivityLog> ApplyCriteria(Context db)
{
    var activitySet = db.ActivityLog.AsQueryable();

    if(!string.IsNullOrWhiteSpace(deviceName))
        activitySet.Where(c => c.Devices.devName.ToLower().Contains(devicename.ToLower());

    //and so on and so forth
    return activitySet;
}

public Response SearchStuff(Criteria criteria)
{
    using(var db = CreateContext())
    {
        var qry = criteria.ApplyApplyCriteria(db);
        //In this instance, whatever is a list on my response object, but I believe it could be
        //anything that handles IEnumerable
        response.Whatever.AddRange(qry);
    }
}
public IQueryable ApplyCriteria(上下文数据库)
{
var activitySet=db.ActivityLog.AsQueryable();
如果(!string.IsNullOrWhiteSpace(deviceName))
其中(c=>c.Devices.devName.ToLower().Contains(devicename.ToLower());
//等等等等
返回活动集;
}
公众响应搜索工具(标准)
{
使用(var db=CreateContext())
{
var qry=标准。应用适用标准(db);
//在本例中,无论响应对象上的列表是什么,但我相信它可能是
//任何可以处理IEnumerable的东西
响应.Whatever.AddRange(qry);
}
}

然后,在条件的调用者中,我可以按照自己的意愿处理查询表。

我以前也这样做过

public IQueryable<ActivityLog> ApplyCriteria(Context db)
{
    var activitySet = db.ActivityLog.AsQueryable();

    if(!string.IsNullOrWhiteSpace(deviceName))
        activitySet.Where(c => c.Devices.devName.ToLower().Contains(devicename.ToLower());

    //and so on and so forth
    return activitySet;
}

public Response SearchStuff(Criteria criteria)
{
    using(var db = CreateContext())
    {
        var qry = criteria.ApplyApplyCriteria(db);
        //In this instance, whatever is a list on my response object, but I believe it could be
        //anything that handles IEnumerable
        response.Whatever.AddRange(qry);
    }
}
        List<ActivityLog> list = db.ActivityLog.Where(c => devicename == "" || c.Devices.devName.ToLower().Contains(devicename.ToLower()))
                                               .Where(c => user == "" || c.Users.uName.ToLower().Contains(user.ToLower()))
                                               .Where(c => alarm == "" || c.AlarmCodes.aName.ToLower().Contains(alarm.ToLower()))
                                               .OrderBy(c => c.dateTime).Skip(skip).Take(pageSize).ToList();
public IQueryable ApplyCriteria(上下文数据库)
{
var activitySet=db.ActivityLog.AsQueryable();
如果(!string.IsNullOrWhiteSpace(deviceName))
其中(c=>c.Devices.devName.ToLower().Contains(devicename.ToLower());
//等等等等
返回活动集;
}
公众响应搜索工具(标准)
{
使用(var db=CreateContext())
{
var qry=标准。应用适用标准(db);
//在本例中,无论响应对象上的列表是什么,但我相信它可能是
//任何可以处理IEnumerable的东西
响应.Whatever.AddRange(qry);
}
}
然后,在条件的调用者中,我可以按照自己的意愿处理可查询项。

List=db.ActivityLog.Where(c=>devicename==“c.Devices.devName.ToLower()。Contains(devicename.ToLower())
        List<ActivityLog> list = db.ActivityLog.Where(c => devicename == "" || c.Devices.devName.ToLower().Contains(devicename.ToLower()))
                                               .Where(c => user == "" || c.Users.uName.ToLower().Contains(user.ToLower()))
                                               .Where(c => alarm == "" || c.AlarmCodes.aName.ToLower().Contains(alarm.ToLower()))
                                               .OrderBy(c => c.dateTime).Skip(skip).Take(pageSize).ToList();
.Where(c=>user==“c.Users.uName.ToLower().Contains(user.ToLower())) .Where(c=>alarm==“c.AlarmCodes.aName.ToLower().Contains(alarm.ToLower())) .OrderBy(c=>c.dateTime).Skip(Skip).Take(pageSize).ToList();
正如Mihai所建议的,您可以组合所有where语句。

List List=db.ActivityLog.where(c=>devicename==“c.Devices.devName.ToLower()。Contains(devicename.ToLower()))
.Where(c=>user==“c.Users.uName.ToLower().Contains(user.ToLower()))
.Where(c=>alarm==“c.AlarmCodes.aName.ToLower().Contains(alarm.ToLower()))
.OrderBy(c=>c.dateTime).Skip(Skip).Take(pageSize).ToList();

正如Mihai所建议的,您可以组合所有where语句。

它给出了错误:此方法无法转换为存储表达式。它给出了错误:此方法无法转换为存储表达式。哦,我看到当我填充2个变量而不填充一个变量时,它会给出所有数据。哦,我看到当我填充2个变量而我不填充填写一个变量,它提供所有数据。我不明白你的意思,但我会详细说明我在应用标准时所做的事情。让我快速编辑我的答案:)我不明白你的意思,但我会详细说明我在应用标准时所做的事情。让我快速编辑我的答案:)