C# 如何使用LINQ从具有多个参数的单个表中搜索记录?

C# 如何使用LINQ从具有多个参数的单个表中搜索记录?,c#,linq,C#,Linq,我试图通过应用多个搜索参数从表中搜索记录。 根据下面的快照。 在这里,根据上面的快照使用各种参数,我想过滤记录。 在这里,用户可以输入任何参数组合来搜索记录。 我尝试了下面的代码,它适用于单个条件,但对于任何搜索参数的组合都失败了 public List<students> SearchStudents(students search) { var result = new List<students>(); var

我试图通过应用多个搜索参数从表中搜索记录。 根据下面的快照。

在这里,根据上面的快照使用各种参数,我想过滤记录。 在这里,用户可以输入任何参数组合来搜索记录。 我尝试了下面的代码,它适用于单个条件,但对于任何搜索参数的组合都失败了

    public List<students> SearchStudents(students search)
            {
     var result = new List<students>();
     var records= from stud in db.students
                                    where stud.enrollmentNumber== search.enrollmentNumber
                                    || stud.enrollmentDate==search.enrollmenttDate
                                    || stud.enrollmentType==search.enrollmentType
                                    || stud.className==search.className
                                    select new Search()
                                    {
                                        enrollmentNumber= stud.enrollmentNumber,
                                        enrollmentDate = stud.enrollmentDate,
                                        enrollmentType = stud.enrollmentType,                                    
                                        Name = stud.Name,
                                        className=stud.className,                                                                      
                                        Description = stud.Description
                                    };
           result = records.ToList();
return result;
    }
公共列表搜索学生(学生搜索)
{
var result=新列表();
var记录=来自数据库中的螺柱
其中stud.enrollmentNumber==search.enrollmentNumber
||stud.enrollmentDate==search.enrollmentDate
||stud.enrollmentType==search.enrollmentType
||stud.className==search.className
选择新搜索()
{
enrollmentNumber=stud.enrollmentNumber,
enrollmentDate=stud.enrollmentDate,
enrollmentType=stud.enrollmentType,
Name=stud.Name,
className=stud.className,
描述=螺柱。描述
};
结果=records.ToList();
返回结果;
}
但这并不正常。意味着无论我传递什么参数,它都返回相同的结果

如表中所示,我有20条记录,注册号是DB中的唯一值字段,因此在这里,当我传递注册号(如“2018-0001”)时,它将返回所有记录,而它只应返回单个reocrd。
有人能给我指点一下吗?

如果你不进一步解释这是怎么回事,我们只能猜测。然而,这样做的一个非常合理的原因是,您包含了不希望过滤的参数

因为您在语句中使用了
s,如果数据库中的任何其他属性是默认的,那么您将返回这些记录。您需要做的是有条件地包括您的
WHERE
子句片段,仅用于您要搜索的属性。不幸的是,对于LINQ的“SQL语法”版本,这是不可能的,因此您需要将查询转换为该版本。(好消息:它的性能稍微好一点,而且通常需要将SQL转换为方法语法。)

由于,在调用
.ToList()
或其他函数以实际开始处理结果之前,不会将查询发送到数据库。这允许您将方法调用链接在一起,即使它们是完全不同的C#语句。这就是您要做的:

public List<students> SearchStudents(students search)
{
    var query = db.students;

    if (!string.IsNullOrWhiteSpace(search.enrollmentNumber))
    {
        query = query.Where(s => s.enrollmentNumber == search.enrollmentNumber);
    }

    if (search.enrollmentDate != DateTime.MinValue)
    {
        query = query.Where(s => s.enrollmentDate == search.enrollmentDate);
    }

    if (!string.IsNullOrWhiteSpace(search.enrollmentType))
    {
        query = query.Where(s => s.enrollmentType == search.enrollmentType);
    }

    if (!string.IsNullOrWhiteSpace(search.className))
    {
        query = query.Where(s => s.className == search.className);
    }

    return query.Select(stud => new Search
                                {
                                    enrollmentNumber= stud.enrollmentNumber,
                                    enrollmentDate = stud.enrollmentDate,
                                    enrollmentType = stud.enrollmentType,                                    
                                    Name = stud.Name,
                                    className=stud.className,                                                                      
                                    Description = stud.Description
                                })
                .ToList();
}
公共列表搜索学生(学生搜索)
{
var query=db.students;
如果(!string.IsNullOrWhiteSpace(search.enrollmentNumber))
{
query=query.Where(s=>s.enrollmentNumber==search.enrollmentNumber);
}
if(search.enrollmentDate!=DateTime.MinValue)
{
query=query.Where(s=>s.enrollmentDate==search.enrollmentDate);
}
如果(!string.IsNullOrWhiteSpace(search.enrollmentType))
{
query=query.Where(s=>s.enrollmentType==search.enrollmentType);
}
如果(!string.IsNullOrWhiteSpace(search.className))
{
query=query.Where(s=>s.className==search.className);
}
返回查询。选择(螺柱=>新搜索
{
enrollmentNumber=stud.enrollmentNumber,
enrollmentDate=stud.enrollmentDate,
enrollmentType=stud.enrollmentType,
Name=stud.Name,
className=stud.className,
描述=螺柱。描述
})
.ToList();
}

您可能需要调整其中的
if
语句,以适应不同于名称直观显示的数据类型,但这只会在提供了值的情况下添加过滤器。

但这不能正常工作是什么意思?它到底不能工作吗?您是否有错误?如果有,是什么错误?或者您是否得到了不正确的结果,如果是,请包括表中的内容以及
搜索
对象的值?这仍然是一个非常模糊的描述。如果没有得到预期的结果,那么我们需要确切地知道数据库中有什么,发送到方法中的
search
对象中的值是什么。你得到了什么结果,你期望得到什么结果。是@juharr,所以我在我的问题中添加了位描述。你在
enrollmentNo
上搜索,但是你选择了
enrollmentNumber
,那么它们之间的区别是什么?