【发布时间】:2018-10-31 14:38:54
【问题描述】:
我有一个网络应用程序,用户可以在其中根据某些过滤条件从数据库中获取记录。他们可以获取所有记录,或两个日期之间的所有记录,或特定实体类型的所有记录,或特定用户的所有记录等。我使用 EF6 和标准 DbContext 类来查询数据库
我要做的是根据请求对象动态构建查询,并且哪些属性不为空。因此,如果用户选择从和到日期,但没有其他条件,则查询应该转到数据库并获取所述日期之间的所有记录。如果用户没有选择日期而是选择实体类型,则查询应该只过滤请求对象的该属性。
那么在伪代码中,在构建查询时我将如何做到这一点
- 检查所有请求对象属性
- 哪些属性不为空,请将它们作为参数添加到查询表达式中
这是我的请求对象
public class ChangeLogRequestDto
{
public DateTime? FromDate { get; set; }
public DateTime? ToDate { get; set; }
public string UserName { get; set; }
public string CallCenter { get; set; }
public string EntityType { get; set; }
public string PropertyName { get; set; }
public string CompanyId { get; set; }
}
这是我的 Service 方法,用于接收此请求对象并构建查询以获取记录
public IEnumerable<ChangeLog> GetChangeLogWithFilter(ChangeLogRequest request)
{
// check the request object and build a query based on its values.
return dbContext.ChangeLogs.Where(query)
}
我查找了其他示例,但鉴于我不熟悉 Expressions 和 Linq,它们对我来说没有意义。有什么想法吗?
【问题讨论】:
-
如果您展示一个实际查询数据库的示例,例如您是使用原始 SQL、存储过程还是 Linq(对于 ORM),或者..
-
@stuartd 我正在使用 EF6,并且到目前为止一直在使用像这样的直接 linq 查询。 return dbContext.ChangeLogs.Where(c=> c.ID == request.Id);
-
Linq != Lambda。它们可以产生相同的结果,但它们的写法不同。
.Where()是一个 Lambda。
标签: c# entity-framework