不确定这是否可行,或者我是否正确表达了我正在寻找的内容,但我的库中反复有以下代码,并且想练习一些 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<MyTableEntity>(
e => e.FieldName.StartsWith(arrayOfQueryTerms[0]));
}
else
{
foreach(string queryTerm in arrayOfQueryTerms)
{
if (!String.IsNullOrEmpty(queryTerm))
{
somequery = somequery
.Where<MyTableEntity>(
e => e.FieldName.Contains(queryTerm));
}
}
}
我希望创建一个带有签名的通用方法,看起来像:
private IQueryable<T> getQuery(
T MyTableEntity, string[] arrayOfQueryTerms, Func<T, bool> predicate)
我在所有表中都使用相同的搜索策略,因此唯一真正不同的用法是搜索的 MyTable 和 MyTableEntity 以及搜索的 FieldName。这有意义吗?LINQ 有没有办法在 where 子句中动态传递要查询的字段名称?或者我可以将其作为谓词 lambda 传递吗?
e => e.FieldName.Contains(queryTerm)
我意识到在 SQL 中有一百万种方法可以做到这一点,可能更容易,但我很乐意为这个保留 LINQ 家族中的所有内容。另外,我觉得泛型应该对这样的问题很方便。有任何想法吗?