不确定这是否可行,或者我是否正确地表达了我正在寻找的内容,但我在我的库中反复使用以下代码,并希望练习一些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&amp;搜索了MyTableEntity并搜索了FieldName。这有意义吗? LINQ是否有办法在where子句中动态传递要查询的字段名称?或者我可以将其作为谓词lambda传递?
e => e.FieldName.Contains(queryTerm)
我意识到在SQL中有一百五十种方法可以做到这一点,可能更容易,但我很乐意为LINQ系列保留所有内容。此外,我觉得泛型应该对这样的问题很方便。有什么想法吗?
答案 0 :(得分:15)
听起来你正在寻找Dynamic Linq。看看here。这允许您将字符串作为参数传递给查询方法,例如:
var query = dataSource.Where("CategoryID == 2 && UnitPrice > 3")
.OrderBy("SupplierID");
答案 1 :(得分:7)
答案 2 :(得分:6)
您可能希望查看表达式树:
IQueryable<T> getQuery<T>(T myTableEntity, string[] arrayOfQueryTerms, Expression<Func<T, bool>> predicate)
{ var fieldOrProperty = getMemberInfo(predicate);
/* ... */
}
MemberInfo getmemberInfo<T>(Expression<Func<T,bool> expr)
{ var memberExpr = expr as MemberExpression;
if (memberExpr != null) return memberExpr.Member;
throw new ArgumentException();
}
var q = getQuery<FooTable>(foo, new[]{"Bar","Baz"}, x=>x.FieldName);
答案 3 :(得分:0)
我最近不得不做同样的事情。您需要Dynamic Linq here才能保持强类型。