我们为用户提供了对数据构建自己的查询的能力。为了完成这项工作,我们使用Dynamic LINQ库。 这个结构给我们带来了问题:我们有一组人,我们查询如下:
( DossierItems.Any( DossierFiles.Any())) && ( FirstName.Contains( \"h\" ) )
这会导致错误说明:
“DossierItem”类型中没有属性或字段“FirstName”
这完全正确:FirstName是person的属性。第二个“任意”之后的右括号以某种方式错过了。
( FirstName.Contains( \"h\" ) ) && ( DossierItems.Any( DossierFiles.Any() ) )
上面的陈述很好,但是我们无法控制谓词输入的顺序。
是否有一种方法可以修改嵌套的Any部分,以便与以下任何谓词一起使用?
这是Dynamic 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;
命名空间ClassLibrary1 {
[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; }
}
}
答案 0 :(得分:1)
如果对任何人有任何帮助,我都会找出原因。这是原始源代码中的一个问题,我刚刚在Github上做了拉取请求并修复了它。
https://github.com/kahanu/System.Linq.Dynamic/pull/68
任何嵌套的linq方法调用都会发生此问题。通过使用Stack替换其解析器中的变量来解决,以便在退出方法调用时获得正确的Type。
答案 1 :(得分:0)
它似乎与原始源代码一起使用,可在此处下载:https://msdn.microsoft.com/en-US/vstudio/bb894665.aspx
只需使用CSharpSamples \ LinqSamples \ DynamicQuery \ DynamicQuery \ Dynamic.cs类而不是System.Linq.Dynamic NuGet包。
答案 2 :(得分:0)
我的分支机构在此库中已经正常工作:System.Linq.Dynamic.Core