我们正在使用 ASP.NET MVC3、EF 4.3.1、DynamicQuery 库我们目前正在开发一个可以对多个数据库执行搜索查询的动态搜索引擎。
所以我们有一个允许用户创建查询的界面。界面如下所示:
所以在那之后,我们在控制器内重新创建组/子句的层次结构,然后我们必须在不同的表之间执行一些连接(例如: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>
的对象,而是适用于连接的对象。
And : 由于我们需要能够对子句进行分组(这就是我们在屏幕截图中使用组的原因),我们必须能够正确生成带括号的 Where 子句。(这可以使用 PredicateBuilder 类来完成,但由于搜索结果是 an IQueryable<T>
,我们不知道 where 子句是否适用于T
类或连接类之一。
我错过了什么吗?是否有任何技巧可以让我在连接完成后但在从数据库中提取对象之前(仍在IQueryable
对象上)添加 where 子句?
编辑 :
事实上,如果我能够在生成的 SQL 查询中指定“as”名称,那么结束 where 子句就可以很容易地完成。有什么方法可以命名连接表(以下示例中的 T2)?
SELECT * FROM Table1 T1
JOIN Table2 T2 on (T1.T2Key = T2.Key)