动态创建具有不同条件的谓词和用于EF 5和VB.NET的多个表

时间:2013-06-24 17:36:41

标签: vb.net linq entity-framework dynamic predicate

我一直在努力解决这个问题,我希望有人可以帮助我。我有一个用VB.NET(.NET 4.0,VS 2012)编写的项目,该项目使用EF 5和通用repo / UoW设置。我需要动态创建谓词以传递给我的repo的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")

或者像上面那样复杂。

1 个答案:

答案 0 :(得分:0)

我已经使用以下方法来做到这一点,但它很快就会变丑。 How to: Use Expression Trees to Build Dynamic Queries