0

我想为我的 linq 查询动态构建 where 子句。

我有一个搜索选项,可以搜索姓名、性别和位置。如何动态构建我的 linq 查询,以便如果只输入名称,我会得到类似:

profiles.where(function(x) x.name = <<nameValue>>)

但是当输入名称和位置时,我会得到如下信息:

profiles.where(function(x) x.name = <<nameValue>> AND x.location = <<locationValue>>)

亲切的问候

4

2 回答 2

3

您可以使用PredicateBuilder

Dim pred = PredicateBuilder.True(Of Profile)()
If Not String.IsNullOrEmpty(nameValue) Then
    pred = pred.And(Function(x) x.name = nameValue)
End If
If Not String.IsNullOrEmpty(locationValue) Then
    pred = pred.And(Function(x) x.location = locationValue)
End If

Dim query = profiles.Where(pred)

(注意:这个解决方案假设profiles是一个IQueryable<Profile>,例如一个实体框架DbSetObjectSet;如果它只是一个普通的集合,使用profiles.AsQueryable()而不是profiles

于 2013-09-02T11:56:04.833 回答
1

如果您的条件始终是ANDed,并且从未ORed,您可以一次构建您的查询:

Dim query = profiles.AsQueryable()

If Not String.IsNullOrEmpty(nameValue) Then
    query = query.Where(Function(x) x.name = nameValue)
End If

If Not String.IsNullOrEmpty(locationValue) Then
    query = query .Where(Function(x) x.location = locationValue)
End If

Return query.ToList()

LINQ 查询执行被延迟,因此在需要结果或您明确要求它执行(例如调用ToList()方法)之前不会执行。

于 2013-09-02T11:59:17.743 回答