嵌套"Any"在动态 LINQ 中不起作用



我们为用户提供了对数据构建自己的查询的能力。为了实现这项工作,我们使用动态 LINQ 库。这种结构给我们带来了问题:我们有一个人员集合,我们查询如下:

( DossierItems.Any( DossierFiles.Any())) && ( FirstName.Contains( "h" ) )

这会导致错误指出:

类型"达

析报告项"中不存在属性或字段"名字"

这是完全正确的:名字是人的财产。第二个"any"之后的右括号不知何故被遗漏了。

( FirstName.Contains( "h" ) ) && ( DossierItems.Any( DossierFiles.Any() ) )

上面的语句工作得很好,但我们无法控制输入谓词的顺序。

有没有办法修改嵌套的任何部分,以便与以下任何谓词很好地配合使用?

下面是动态 Linq 在分析动态 linq 字符串时生成的堆栈跟踪:

   at System.Linq.Dynamic.ExpressionParser.ParseMemberAccess(Type type, Expression instance)
   at System.Linq.Dynamic.ExpressionParser.ParseIdentifier()
   at System.Linq.Dynamic.ExpressionParser.ParsePrimaryStart()
   at System.Linq.Dynamic.ExpressionParser.ParsePrimary()
   at System.Linq.Dynamic.ExpressionParser.ParseUnary()
   at System.Linq.Dynamic.ExpressionParser.ParseMultiplicative()
   at System.Linq.Dynamic.ExpressionParser.ParseAdditive()
   at System.Linq.Dynamic.ExpressionParser.ParseComparison()
   at System.Linq.Dynamic.ExpressionParser.ParseLogicalAnd()
   at System.Linq.Dynamic.ExpressionParser.ParseLogicalOr()
   at System.Linq.Dynamic.ExpressionParser.ParseExpression()
   at System.Linq.Dynamic.ExpressionParser.ParseParenExpression()
   at System.Linq.Dynamic.ExpressionParser.ParsePrimaryStart()
   at System.Linq.Dynamic.ExpressionParser.ParsePrimary()
   at System.Linq.Dynamic.ExpressionParser.ParseUnary()
   at System.Linq.Dynamic.ExpressionParser.ParseMultiplicative()
   at System.Linq.Dynamic.ExpressionParser.ParseAdditive()
   at System.Linq.Dynamic.ExpressionParser.ParseComparison()
   at System.Linq.Dynamic.ExpressionParser.ParseLogicalAnd()
   at System.Linq.Dynamic.ExpressionParser.ParseLogicalOr()
   at System.Linq.Dynamic.ExpressionParser.ParseExpression()
   at System.Linq.Dynamic.ExpressionParser.Parse(Type resultType)
   at System.Linq.Dynamic.DynamicExpression.ParseLambda(ParameterExpression[] parameters, Type resultType, String expression, Object[] values)
   at System.Linq.Dynamic.DynamicExpression.ParseLambda(Type itType, Type resultType, String expression, Object[] values)
   at System.Linq.Dynamic.DynamicQueryable.Where(IQueryable source, String predicate, Object[] values)
   at Repositories.Base.Repository`1.ApplyQuery(IQueryable`1 entities, Guid queryId)
   at Search.SearchQueryResult.RunQuery[T](IQueryable`1 entities, IRepository`1 repository)

重现的代码示例

using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Collections.Generic;
using System.Linq.Dynamic;

命名空间类库1 {

[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void TestMethod1()
    {
        // arrange
        var allAs = new List<A>();
        // act
        // pass
        var actual = allAs.Where("(Name = "")&&(Bs.Any(Cs.Any()))");
        // fail
        var actual = allAs.Where("(Bs.Any(Cs.Any()))&&(Name = "")");        
    }
}
public class A
{
    public string Name { get; set; }
    public IList<B> Bs
    {
        get { return bs; }
        set { bs = value; }
    }
    private IList<B> bs = new List<B>(0);
}
public class B
{
    public A A { get; set; }
    public IList<C> Cs
    {
        get { return cs; }
        set { cs = value; }
    }
    private IList<C> cs = new List<C>(0);
}
public class C
{
    public B B { get; set; }
}

}

如果这对任何人有任何帮助,我就找到了原因。这是原始来源中的一个问题,我刚刚在 Github 上做了一个拉取请求并修复了它。

https://github.com/kahanu/System.Linq.Dynamic/pull/68

任何嵌套的 linq 方法调用都会发生此问题。通过用 Stack 替换解析器中的变量来解决,以便在跳出方法调用时弹出正确的类型。

它似乎适用于原始源代码,可以在这里下载:https://msdn.microsoft.com/en-US/vstudio/bb894665.aspx

只需使用 CSharpSamples\LinqSamples\DynamicQuery\DynamicQuery\Dynamic.cs 类,而不是 System.Linq.Dynamic NuGet 包。

已经在这个

库中的分支中工作正常:System.Linq.Dynamic.Core

相关内容

  • 没有找到相关文章

最新更新