我有一个类似以下的接口:
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,但这是我第一次坐在管道的另一端......我已经阅读了一些有关表达式树和反射的文章,但是这些知识还没有完全掌握。我如何(如果可以)分解/反射谓词,以便获得参数列表,然后将它们连接成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)