动态LINQ集合?

Sim*_*gré 5 c# asp.net entity-framework dynamic-linq

我有一个项目要求我做这么大的搜索引擎,但这一切都是动态的.我的意思是我可以拥有大约0到9个主要的"组",这些组内部的东西就像是"无论是""或"与"或"的无限可能性.我们首先想到的是使用Dynamic Linq,它提供了构建动态查询的良好替代方案.所有这些都使用EF和自制包装.

问题:我无法访问"收藏".我的意思是,我可以伊斯利访问引用的对象(像Customer.State.StateName ="新纽约" OR Custoemr.State.StateName ="魁北克"),但我无法找到一个方法来存取权限是这样的:" 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);
Run Code Online (Sandbox Code Playgroud)

即使是paretheses中的运算符也是动态的("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();
    }
Run Code Online (Sandbox Code Playgroud)

它工作得很好,而不是"不返回布尔值".那我该怎么办?错误:"预期类型'布尔'的表达式".

最后,它返回类似:"(Domaines.Where(DomaineId == 2 && DomaineId == 3 && DomaineId == 4 && DomaineId == 5))." 这是添加到我的LINQ查询:

var queryWithWhere = from c in m_context.Candidats.Where(WHERE)
                                     select c;
Run Code Online (Sandbox Code Playgroud)

不要忘记,还有7或8个"可能"添加的东西可供搜索...任何想法?

Rub*_*ben 5

你需要做的是构建一个LambdaExpression(更具体地说是一个Expression<Func<T, bool>>).你不能使用字符串.您可以构建一个这样的简单表达式:

ParameterExpression p = Expression.Parameter(typeof(Domaine), "domaine");
Expression<Func<Domaine, bool>> wherePredicate = 
  Expression.Lambda<Func<Domaine, bool>>(
    Expression.Or(
      Expression.Equal(
        Expression.Property(p, "DomainID"),
        Expression.Constant(10)),
      Expression.Equal(
        Expression.Property(p, "DomainID"),
        Expression.Constant(11))
      ), p);
Run Code Online (Sandbox Code Playgroud)

domaine.DomainID = 10 || domaine.DomainID = 11

如果您需要手动执行此操作,则不太可读.

有一个完全可操作的表达式解析器的示例,它将基于在MSDN代码库中的C#Samples for Visual Studio 2008中的字符串,在DynamicQuery下实际为您执行此操作.(该LinqDataSource控件在内部使用此示例的略微修改版本.)