Asp.net 构建动态LINQ查询的最佳方法
嗨,我正在寻找编写动态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;
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;
}