当前位置:  开发笔记 > 编程语言 > 正文

通用LINQ查询谓词?

如何解决《通用LINQ查询谓词?》经验,为你挑选了3个好方法。

不确定这是否可行,或者我是否正确地表达了我正在寻找的内容,但我在我的库中反复使用以下代码,并想练习一些DRY.我根据用户提供的简单搜索字段ala Google查询了一组SQL Server表.我正在使用LINQ根据搜索字符串中的内容组成最终查询.我正在寻找一种方法来使用泛型并传递lambda函数来创建一个可重用的例程:

string[] arrayOfQueryTerms = getsTheArray();

var somequery = from q in dataContext.MyTable
                select q;

if (arrayOfQueryTerms.Length == 1)
{
    somequery = somequery.Where(
        e => e.FieldName.StartsWith(arrayOfQueryTerms[0]));
}
else
{
    foreach(string queryTerm in arrayOfQueryTerms)
    {
        if (!String.IsNullOrEmpty(queryTerm))
        {
            somequery = somequery 
                        .Where(
                            e => e.FieldName.Contains(queryTerm));
        }
    }
}

我希望创建一个带签名的通用方法,它看起来像:

private IQueryable getQuery(
    T MyTableEntity, string[] arrayOfQueryTerms, Func predicate)

我在所有表中使用相同的搜索策略,因此唯一与使用情况完全不同的是搜索到的MyTable和MyTableEntity以及搜索到的FieldName.这有意义吗?LINQ是否有办法在where子句中动态传递要查询的字段名称?或者我可以将其作为谓词lambda传入?

e => e.FieldName.Contains(queryTerm)

我意识到在SQL中有一百五十种方法可以做到这一点,可能更容易,但我很乐意为LINQ系列保留所有内容.此外,我觉得泛型应该对这样的问题很方便.有任何想法吗?



1> Erik Forbes..:

听起来你正在寻找Dynamic Linq.看看这里.这允许您将字符串作为参数传递给查询方法,例如:

var query = dataSource.Where("CategoryID == 2 && UnitPrice > 3")
                      .OrderBy("SupplierID");

编辑:关于此主题的另一组帖子,使用C#4的动态支持:第1 部分和第2部分.



2> Quintin Robi..:

它听起来像你基本上想要一个条件谓词构建器..

我希望你能把它变成你想要的东西,祝你好运!

http://www.albahari.com/nutshell/predicatebuilder.aspx



3> Mark Cidade..:

您可能想要查看表达式树:

IQueryable getQuery(T myTableEntity, string[] arrayOfQueryTerms, Expression> predicate)
 { var fieldOrProperty = getMemberInfo(predicate);
   /* ... */
 }

MemberInfo getmemberInfo(Expression expr)
 { var memberExpr = expr as MemberExpression;
   if (memberExpr != null) return memberExpr.Member;
   throw new ArgumentException();
 }

var q = getQuery(foo, new[]{"Bar","Baz"}, x=>x.FieldName);

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有