c# - 使用 linq 和 Entityframework 实现高级搜索的最佳实践

标签 c# entity-framework linq

我正在尝试使用 LINQ 和 Entity Framework 在我的应用程序中构建高级搜索,具体取决于 10 个参数,但用户可以发送一个或多个参数进行搜索。我厌倦了像下面的方式实现它,但它不起作用,而不是制定 if 条件并更改每次检查的查询。

那么有没有什么简单的方法可以使用LINQ根据用户输入来选择匹配结果呢?

var data = (from item in db.Student
           where item.Firstname == fname
           && item.Middlename == mname
           && item.Lastname == lname
           && item.Birthday == birthday
           && item.Age == age
           && item.AdmissionYear == year
           && item.Grade == grade
           && item.Address == Address
           && item.Class == class
           && item.Number == number
           select item).FirstOrDefault();

最佳答案

实现这一点的简单方法是使用where子句链接的形式。与表达式树相比,我一直更喜欢这种方法,因为它简单明了。

假设所有谓词值都可以为空,下面是一个示例:

var query = db.Student.AsQueryable();

if (age != null)
    query = query.Where(s => s.Age == age.Value);
if (fname != null)
    query = query.Where(s => s.Firstname == fname);
if (lname != null)
    query = query.Where(s => s.Lastname == lname);

// etc...

var student = query.FirstOrDefault();

通过这种方式,您可以仅使用用户传入的属性来动态构建 where 子句,而忽略其余属性。

您还可以在新的Filter对象中定义所有参数,并将这些“if”语句提取到它们自己的FilterStudents方法中,该方法采用IQueryable 过滤器 作为参数。

关于c# - 使用 linq 和 Entityframework 实现高级搜索的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38542363/

相关文章:

Linq表达式树字符串比较

c# - 集合的 Linq 等价物至少包含 x 个项目;像 .Any() 而是 .AtLeast(int)

c# - 如何将 ASP.NET 隐藏字段值分配给 JavaScript 变量?

entity-framework - 在我的EF实现通用存储库中找不到.Include()方法

c# - ForEach 扩展方法中的多重选择

asp.net-mvc - 未找到类型 'System.Data.Entity.Infrastructure.SqlConnectionFactory' 的构造函数

c# - 加速简单的 LINQ 查询

c# - 提高并发字典访问效率c#

c# - 在 ulong (C#) 中获得最后一个有效位的最快方法?

c# - Linq for rank() 在 SQL Server 中等效 -