【发布时间】:2009-12-18 19:46:37
【问题描述】:
我想使用 linq to sql 构建一个通用搜索窗口。
这就是我想要做的:
class SearchWindow<T> : Form : Where T: class
{
public SearchWindow(Func<T, string> codeSelector,
Func<T, string> nameSelector)
{
var db = new DataContext();
var table = db.GetTable<T>();
var query = from item in table where
codeSelector(item).Contains(someText) &&
nameSelector(item).Contains(someOtherText)
select item;
}
}
我试图像这样使用它:
var searchWindow = new SearchWindow<SomeTable>(x => x.CodeColumn,
y => y.NameColumn).Show();
很遗憾,这不起作用,我读到了关于表达式树的文章,所以我尝试用它们来做这件事,我得到了:
public SearchWindow(codeColumn, nameColumn)
{
Table<T> table = db.GetTable<T>();
var instanceParameter = Expression.Parameter(typeof(T), "instance");
var methodInfo = typeof(string).GetMethod("Contains",
new Type[] { typeof(string) });
var codigoExpression = Expression.Call(Expression.Property(instanceParameter,
codeColumn),
methodInfo,
Expression.Constant("someText",
typeof(string)));
var nombreExpression = Expression.Call(Expression.Property(instanceParameter,
nameColumn),
methodInfo,
Expression.Constant("someOtherText",
typeof(string)));
var predicate = Expression.Lambda<Func<T, bool>>(
Expression.And(codigoExpression, nombreExpression), instanceParameter);
var query = table.Where(predicate);
}
要使用它,我需要这样做:
new SearchWindow<SomeTable>("codeColumn", "nameColumn");
但我不喜欢需要将列名作为字符串输入的方法,有什么方法可以以类似于我的第一种方法的方式进行(以便具有智能感知和强类型)?
感谢您的帮助。
【问题讨论】:
-
我认为缺少的部分是“Expression.Invoke”和“Expression.AndAlso”;我试图展示一个例子。
标签: c# linq-to-sql expression-trees