动态查询创建(动态搜索引擎)

时间:2013-04-03 12:20:44

标签: c# asp.net-mvc-3 iqueryable entity-framework-4.3 dynamicquery

我们正在使用ASP.NET MVC3,EF 4.3.1,DynamicQuery库 我们目前正在开发一个动态搜索引擎,可以在多个数据库中再次执行搜索查询。

因此我们有一个允许用户创建查询的界面。 接口如下所示:screenshot with selected ddl value

之后,我们在控制器内重新创建groups /子句的层次结构,然后我们必须在不同的表之间执行一些连接(例如:Study / People)。

问题在于,当我们执行连接时,我们按以下方式执行:

if (queries.ContainsKey("Drug"))
{
    query = query.Join(GetContext().StudyDrugs, s => s, sd => sd.StudyId, (s, sd) => new { Study = s, StudyDrug = sd })
                 .Join((IQueryable<int>)queries["Drug"], obj => obj.StudyDrug.DrugId, d => d, (obj, d) => obj.Study);
}

但是我们不能设置生成的查询的Where子句,因为它们并不总是适用于搜索的IQueryable<T>,而是应用于连接的对象。

并且: 由于我们需要能够对子句进行分组(这就是我们在屏幕截图中使用组的原因),因此我们必须能够使用括号正确生成Where子句。 (这可以通过PredicateBuilder类完成,但由于搜索结果是IQueryable<T>,我们不知道where子句是否适用于T类或其中一个连接类

我错过了什么吗?是否有任何技巧可以允许我在连接完成之后但在从数据库中取出对象之前添加where子句(仍然在IQueryable对象上)?

编辑:

实际上,如果我能够在生成的SQL查询中指定'as'名称,那么结束where子句可以很容易地完成。 有没有办法命名连接表(以下示例中的T2)?

SELECT * FROM Table1 T1
JOIN Table2 T2 on (T1.T2Key = T2.Key)

0 个答案:

没有答案