我有一个类似如下的界面:
public IEnumerable<IDocument> Search(Predicate<IDocument> predicate) { ... }
IDocument 看起来像这样:
public interface IDocument
{
string Id {get; set;}
string Title {get; set;}
...
}
我即将实现一个文档提供程序,我必须在其中分解谓词的内容并提取属性,以便为我们目前没有 OR/M 映射的文档数据库创建 SQL 字符串。示例:我想知道用户是按 ID 还是按标题搜索,以便我知道我是否可以按 ID 搜索或必须对标题执行 LIKE 搜索。
我一直大量使用 LINQ,但这是我第一次坐在管道的另一端......我已经阅读了一些关于表达式树和反射的内容,但这些部分还没有落入地方呢。我如何(如果?)分解/反射(reflect)谓词,以便获得可以连接到 SQL 字符串中的参数列表?我正在寻找类似这个草图的东西:
public IEnumerable<IDocument> Search(Predicate<IDocument> predicate)
{
string id = DoSomeMagic(predicate, "Id");
string title = DoSomeMagic(predicate, "Title");
if (!string.isNullOrEmpty(id))
...make ID search
else
...search by title
}
免责声明:该提供程序适用于今年秋天即将更换的内部遗留系统,这使得内联 SQL 成为正确的选择;o)
最佳答案
您不能对谓词或委托(delegate)执行此操作。它们是经过编译的,不可能获得有关它返回的内容的信息。为此,你确实需要 Expression
树,但你自己解析它可能很困难。您最好使用 O/RM 工具。
例如,当您将表达式与 LINQ to SQL 一起使用时,构建搜索方法将变得轻而易举:
public IEnumerable<Document> Search(
Expression<Func<Document, bool>> predicate)
{
using (db = new DocumentDataContext())
{
return db.Documents.Where(predicate).ToArray();
}
}
关于c# - 获取 Predicate<T> 属性信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2409442/