我试图在这里进行一些非常动态的查询 - 最好不要在运行时调用编译器.
我有一个包含LINQ表达式的字符串,例如
var s = "from a in queryable where a.Type == 1 select a";
Run Code Online (Sandbox Code Playgroud)
如何从中获得由此产生的IQueryable或表达式?
我见过LINQPad和RavenDb都这样做,所以我确信有一种方法,我还没有找到它.
我正忙着准备MCTS 70-536考试,根据考试书(Microsoft Press - .NET Framework - 应用程序开发基础自学训练套件第2版),此代码示例:
ArrayList al = new ArrayList();
al.AddRange(new string[] { "Hello", "world", "this", "is", "a", "test" });
Console.WriteLine(al.BinarySearch("this"));
Run Code Online (Sandbox Code Playgroud)
将值'2'输出到控制台,因为项'this'位于索引2.同意这是我运行该代码时得到的输出.
但是,如果我跑
Console.WriteLine(al.BinarySearch("world"));
Run Code Online (Sandbox Code Playgroud)
我希望在控制台中获得值1,因为'world'将在索引1,但是我得到值-7?
谁能解释一下这是如何工作的?
谢谢
我正在使用 Mono.CSharp 库来发出代码。在关于 SO (http://stackoverflow.com/questions/3407318/mono-compiler-as-a-service-mcs) 的另一个问题之后,我设法让 Mono.CSharp 在 Microsoft CLR 上正确评估。
为了在我的应用程序中增加灵活性,我希望能够在运行时自定义查询 - 通过允许用户提供 LINQ 查询作为字符串,该字符串在执行时被解析并命中数据库。
鉴于此基本代码片段:
IQueryable<Contact> contacts = GetContacts();
string query = "from contact in contacts
where contact.Name == \"name\"
select contact";
var queryableResult = Mono.CSharp.Evaluator.Evaluate(query);
Run Code Online (Sandbox Code Playgroud)
如何将联系人变量“注入”到 Mono.CSharp.Evaluator 中以作为查询的一部分进行评估?我会以正确的方式解决这个问题吗?最后,我需要结果表达式或来自“查询”字符串的 IQueryable。