Asp.net 构建动态LINQ查询的最佳方法

Asp.net 构建动态LINQ查询的最佳方法,asp.net,linq,Asp.net,Linq,嗨,我正在寻找编写动态LINQ查询的最佳方法 我有一个函数 public IQueryable<Student> FindByAllStudents(int? id, string Name, int? CourseID, bool? IsActive) // like this way, all field values are passed { // code for compairision return db.Student;

嗨,我正在寻找编写动态LINQ查询的最佳方法

我有一个函数

public IQueryable<Student> FindByAllStudents(int? id, string Name, int? CourseID, bool? IsActive) // like this way, all field values are passed
    {    
        // code for compairision
        return db.Student;
    }
那么,如果我不传递ID(即Null),这个方法会起作用吗? 所有数据类型的正确方式是什么

点is函数可以将所有空值作为select*from语句等价性的参数


有人能帮我用示例代码构建最佳查询吗

好的,还不完全清楚您想要什么,但是如果您试图只为非null的参数添加where子句,您可以执行以下操作:

public IQueryable<Student> FindByAllStudents
    (int? id, string name, int? courseID, bool? isActive)
{    
    IQueryable<Student> query = db.Student;
    if (id != null)
    {
        query = query.Where(student => student.ID == id.Value);
    }
    if (name != null)
    {
        query = query.Where(student => student.Name.Contains(name));
    }
    if (courseID != null)
    {
        query = query.Where(student => student.CourseID == courseID.Value);
    }
    if (isActive != null)
    {
        query = query.Where(student => student.IsActive == isActive.Value);
    }
    return query;
}
不过,值得先尝试一下更简单的形式:)

当然,这一切都有点让人恼火。一个有用的扩展方法可以使生活更加简洁:

public static IQueryable<TSource> OptionalWhere<TSource, TParameter>
    (IQueryable<TSource> source,
     TParameter? parameter, 
     Func<TParameter, Expression<Func<TSource,bool>>> whereClause)
    where TParameter : struct
{
    IQueryable<TSource> ret = source;
    if (parameter != null)
    {
        ret = ret.Where(whereClause(parameter.Value));
    }
    return ret;
}
公共静态IQueryable选项where
(i)可供查阅的资料来源,
t参数?参数,
(第条)
其中t参数:struct
{
IQueryable ret=源;
if(参数!=null)
{
ret=ret.Where(Where子句(参数值));
}
返回ret;
}
然后您可以这样使用它:

    if (courseID != null)
    {
        int queryCourseID = courseID.Value;
        query = query.Where(student => student.CourseID == queryCourseID);
    }
public IQueryable<Student> FindByAllStudents
    (int? id, string name, int? courseID, bool? isActive)
{    
    IQueryable<Student> query = db.Student
        .OptionalWhere(id, x => (student => student.ID == x))
        .OptionalWhere(courseID, x => (student => student.CourseID == x))
        .OptionalWhere(isActive, x => (student => student.IsActive == x));
    if (name != null)
    {
        query = query.Where(student => student.Name.Contains(name));
    }
    return query;
}
public IQueryable FindByAllStudents
(int?id、字符串名称、int?courseID、bool?isActive)
{    
IQueryable query=db.Student
.OptionalWhere(id,x=>(student=>student.id==x))
.OptionalWhere(courseID,x=>(student=>student.courseID==x))
.OptionalWhere(isActive,x=>(student=>student.isActive==x));
if(name!=null)
{
query=query.Where(student=>student.Name.Contains(Name));
}
返回查询;
}

如果您对这样的高阶函数不太熟悉,那么使用这样的高阶函数可能会让您感到困惑,因此,如果您不太喜欢这样的查询,您可能希望使用更长但更简单的代码。

谢谢!对于第一个解决方案,我们还可以使用if(id.HasValue){than use id.Value}您能指导我使用全文搜索吗?使用HasValue相当于使用!=无效的恐怕我不知道如何在LINQ上使用全文搜索。我喜欢扩展方法Jon!Linq+全文搜索讨论:如果可以的话,请对此稍加评论,我在处理字符串时遇到了一些问题,因为字符串已经可以为null(据我所知,它是ref类型,而不是struct,如果我没有弄错的话)。只需再次查看代码,我就可以看到您分别查询了name-可能是由于这个限制?
public IQueryable<Student> FindByAllStudents
    (int? id, string name, int? courseID, bool? isActive)
{    
    IQueryable<Student> query = db.Student
        .OptionalWhere(id, x => (student => student.ID == x))
        .OptionalWhere(courseID, x => (student => student.CourseID == x))
        .OptionalWhere(isActive, x => (student => student.IsActive == x));
    if (name != null)
    {
        query = query.Where(student => student.Name.Contains(name));
    }
    return query;
}