创建一个动态Where子句作为Linq表达式

时间:2011-11-15 17:55:52

标签: c# linq linq-to-sql

我试图动态地将where条件附加到单个表达式对象中,然后将该表达式对象传递给将使用它的方法。但是,我不断得到“此时此类名称不可用”。

提前致谢!

更新
我终于能够创建一个working example here

代码如下:

    var view = new vw_QuickFindResult();

   // This wont compile
    Expression<Func<vw_QuickFindResult, bool>> where = Expression<Func<vw_QuickFindResult, bool>>(view, true);

    // Build LIKE Statement
    var searches = new List<String>(searchText.Split(' '));
    searches.ForEach(productName =>
    {
        productName.Replace('"', '%');
        productName.Replace('*', '%');
        where = x => SqlMethods.Like(view.DocumentName, productName);
    });

    return DocumentCollectionService.ListQuickFind(where);

1 个答案:

答案 0 :(得分:3)

这是一个问题:

where = x => SqlMethods.Like(view.DocumentName, productName);

您忽略了x,而是使用刚刚初始化的view。我怀疑你想要:

where = x => SqlMethods.Like(x.DocumentName, productName);

但是,每次替换现有的where表达式。我认为你应该使用Joe Albhari的PredicateBuilder。我个人也避免使用ForEach

var where = PredicateBuilder.False<vw_QuickFindResult>();

// Build LIKE Statement
foreach (string productName in searchText.Split(' '))
{
    string like = productName.Replace('"', '%');
                             .Replace('*', '%');
    where = where.Or(x => SqlMethods.Like(view.DocumentName, like));
}

return DocumentCollectionService.ListQuickFind(where);

(我猜你想要的功能;你可能需要PredicateBuilder.TrueAnd扩展方法。)