gpt4 book ai didi

c# - 嵌套的 "Any"在动态 linq 中不起作用

转载 作者:太空宇宙 更新时间:2023-11-03 13:05:48 25 4
gpt4 key购买 nike

我们为用户提供了对数据构建自己的查询的能力。为了完成这项工作,我们使用动态 LINQ 库。这种构造给我们带来了问题:我们有一组人,我们按如下方式查询:

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

这导致错误指出:

No property or field 'FirstName' exists in type 'DossierItem'

这是完全正确的:FirstName 是 person 的属性。第二个“any”之后的右括号不知何故被遗漏了。

( 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;

命名空间类库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 替换解析器中的变量来解决,以获得在退出方法调用时弹出的正确类型。

关于c# - 嵌套的 "Any"在动态 linq 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30846189/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com