【问题标题】:Dynamic LINQ: Comparing Nested Data With Parent Property动态 LINQ:将嵌套数据与父属性进行比较
【发布时间】:2015-02-28 00:45:22
【问题描述】:

我有一个具有以下结构的类:

 public class BestWayContext
{
    public Preference Preference { get; set; }
    public DateTime DueDate { get; set; }
    public List<ServiceRate> ServiceRate { get; set; }
}

public class ServiceRate
{
    public int Id { get; set; }
    public string Carrier { get; set; }
    public string Service { get; set; }
    public decimal Rate { get; set; }
    public DateTime DeliveryDate { get; set; }
}

我有动态 linq 表达式字符串

“Preference != null && ServiceRate.Any(Carrier == Preference.Carrier)”

我想在动态 LINQ 中将上述字符串转换如下:

  var expression = System.Linq.Dynamic.DynamicExpression.ParseLambda<BestWayContext, bool>(condition, null).Compile();

但它显示以下错误:

请纠正我我做错了什么?

【问题讨论】:

    标签: linq c#-4.0 lambda expression dynamic-linq


    【解决方案1】:

    看起来你想做这样的事情:

    var bwc = new BestWayContext
    {
        Preference = new Preference { Carrier = "test" },
        DueDate = DateTime.Now,
        ServiceRate = new List<ServiceRate>
        {
            new ServiceRate
            {
                Carrier = "test",
                DeliveryDate = DateTime.Now,
                Id = 2,
                Rate = 100,
                Service = "testService"
            }
        }
    };
    
    string condition = "Preference != null && ServiceRate.Any(Carrier == @0)";
    var expression = System.Linq.Dynamic.DynamicExpression.ParseLambda<BestWayContext, bool>(condition, bwc.Preference.Carrier).Compile();
    bool res = expression(bwc); // true
    bwc.ServiceRate.First().Carrier = "test1"; // just for testing this -> there is only one so I've used first
    res = expression(bwc); // false
    

    【讨论】:

    • 感谢您的回答。它确实对我有很大帮助,但是,当您更改“ServiceRate.Any(Carrier == @0)”时,我们无法更改条件字符串。那么有没有其他方法可以做到这一点?
    • 我不知道有什么方法可以做到这一点(可能有一个)。看起来 Any 内部的条件范围很窄。如果我想出点什么,我会在这里更新。
    【解决方案2】:

    您想使用属于 BestWayContext 但您没有告诉编译器的 Preference。如果我在 Linq 上写下你的表达式,我会这样做:

    [BestWayContext 列表].Where(f => f.Preference != null && f.ServiceRate.Where(g => g.Carrier == f.Preference.Carrier) );

    如你所见,我指定使用 BestWayContext 的首选项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-05
      • 2019-04-29
      • 2021-05-22
      • 2020-02-26
      相关资源
      最近更新 更多