1

我一直在努力解决这个问题,我希望这里有人可以帮助我。我有一个使用 EF 5 和通用 repo/UoW 设置的 VB.NET(.NET 4.0,VS 2012)编写的项目。我需要动态创建谓词以传递给我的仓库的 Where() 函数,该函数的实现很简单:

    Public Function Where(predicate As Expression(Of Func(Of T, Boolean))) As IEnumerable(Of T) Implements IDatabaseRepository(Of T).Where
        Return _context.GetDBSet(Of T).Where(predicate).ToList()
    End Function

根据用户输入的标准,谓词可能会变得有些复杂。这是我尝试动态构建的谓词的一个示例。

Function(p) p.ProductCategoryID = 56 AndAlso p.ProductLabels.Any(Function(pl) pl.ProductID = p.ProductID AndAlso (pl.LabelID = 2 OrElse pl.LabelID = 3)) AndAlso p.ProductLabels.Any(Function(pl) pl.ProductID = p.ProductID AndAlso pl.LabelID = 27) AndAlso p.ProductPrices.Any(Function(pp) pp.ProductID = p.ProductID AndAlso pp.PriceTypeID = 2 AndAlso pp.Price > 10)

如果我像这样将它传递给 Where 函数,我会得到我期望的结果。不过,我不知道如何动态创建它。我玩过 PredicateBuilder,但我无法让它工作。

谓词可以很简单:

Function(p) p.SKU.StartsWith("ABC")

或者和上面的一样复杂。

4

1 回答 1

0

我已经使用以下方法来做到这一点,但它会很快变得丑陋。如何:使用表达式树构建动态查询

于 2013-06-24T20:48:27.047 回答