【发布时间】:2009-08-20 13:05:22
【问题描述】:
我有一个项目要求我做一个这么大的搜索引擎,但它是动态的。我的意思是我可以有大约 0 到 9 个主要的“组”,其中包含无限的可能性,比如用“OR”或“AND”来“在哪里”。我们首先想到的是使用 Dynamic Linq,它为构建动态查询提供了一个很好的替代方案。所有这些都使用带有自制包装器的 EF。
问题: 我无法访问“收藏”。我的意思是,我可以轻松访问引用的对象(例如 Customer.State.StateName = "New-York" OR Custoemr.State.StateName = "Quebec" )但我找不到方法访问类似:“Customer.Orders.OrderID = 2 OR Customer.Orders.OrderID = 3”。我可以很容易地弄清楚这是因为它是一个集合,但是我该怎么做呢?
请帮帮我!!
** 对不起我的英语!!
更新
我觉得我不太清楚,对不起,因为我是法国人......
我的问题是因为没有什么是静态的。它是招聘公司的候选人搜索引擎,可将候选人放入企业。在经理可以搜索候选人的页面中,他可以通过以下方式“解析”:域(工作)、城市或许多其他用户在注册时填写的内容。所有这些都是格式(如果它是在 SQL 中):
[...] WHERE (domaine.domainID = 3 OR domaine.domainID = 5 OR domaine.domainID = 23) AND (cities.cityID = 4, cities.city = 32) [...]
所以我不能用普通的 LINQ 格式来做到这一点:
Candidat.Domaines.Where(domain => domain.DomainID == 3 || domain.DomainID == 5 || domain.DomainID == 23);
即使是括号中的运算符也是动态的(“AND”或“OR”)!这就是我们尝试使用 Dynamic Linq 的原因,因为它更加灵活。
希望它更容易理解我的问题...
更新 2 这是我的方法
private string BuildDomainsWhereClause() {
StringBuilder theWhere = new StringBuilder();
if (this.Domaines.NumberOfIDs > 0) {
theWhere.Append("( ");
theWhere.Append(string.Format("Domaines.Where( "));
foreach (int i in this.Domaines.ListOfIDs) {
if (this.Domaines.ListOfIDs.IndexOf(i) > 0) {
theWhere.Append(string.Format(" {0} ", this.DispoJours.AndOr == AndOrEnum.And ? "&&" : "||"));
}
theWhere.Append(string.Format("DomaineId == {0}", i));
}
theWhere.Append(" ))");
}
return theWhere.ToString();
}
它“不返回布尔值”反而效果很好。那我该怎么办? 错误:“预期为 'Boolean' 类型的表达式”。
最后,它返回如下内容:“( Domaines.Where( DomaineId == 2 && DomaineId == 3 && DomaineId == 4 && DomaineId == 5 ))。”添加到我的 LINQ 查询中:
var queryWithWhere = from c in m_context.Candidats.Where(WHERE)
select c;
不要忘记还有 7 或 8 个“可能”添加的内容要搜索...有什么想法吗?
【问题讨论】:
标签: c# asp.net entity-framework dynamic-linq