动态LINQ:将嵌套数据与父属性进行比较

动态LINQ:将嵌套数据与父属性进行比较,linq,c#-4.0,lambda,expression,dynamic-linq,Linq,C# 4.0,Lambda,Expression,Dynamic Linq,我有一个具有以下结构的类: 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;

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

 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; }
}
公共类BestWayContext
{
公共首选项{get;set;}
公共日期时间DueDate{get;set;}
公共列表服务速率{get;set;}
}
公共类服务费率
{
公共int Id{get;set;}
公共字符串载体{get;set;}
公共字符串服务{get;set;}
公共十进制率{get;set;}
public DateTime DeliveryDate{get;set;}
}
我有一个动态linq表达式字符串

“首选项!=null&&ServiceRate.Any(承运人==Preference.Carrier)”

我想在动态LINQ中转换上面的字符串,如下所示:

  var expression = System.Linq.Dynamic.DynamicExpression.ParseLambda<BestWayContext, bool>(condition, null).Compile();
var expression=System.Linq.Dynamic.DynamicExpression.ParseLambda(条件,null.Compile();
但它显示出以下错误:


请纠正我,我做错了什么

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

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
var bwc=新的BestWayContext
{
首选项=新首选项{Carrier=“test”},
DueDate=日期时间。现在,
ServiceRate=新列表
{
新服务费率
{
Carrier=“测试”,
DeliveryDate=日期时间。现在,
Id=2,
比率=100,
Service=“testService”
}
}
};
string condition=“Preference!=null&&ServiceRate.Any(Carrier==0)”;
var expression=System.Linq.Dynamic.DynamicExpression.ParseLambda(condition,bwc.Preference.Carrier.Compile();
bool res=表达式(bwc);//真的
bwc.ServiceRate.First().Carrier=“test1”//只是为了测试->只有一个,所以我先用了
res=表达式(bwc);//假的

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

  var expression = System.Linq.Dynamic.DynamicExpression.ParseLambda<BestWayContext, bool>(condition, null).Compile();
[BestWayContext列表]。其中(f=>f.Preference!=null&&f.ServiceRate.Where(g=>g.Carrier==f.Preference.Carrier) );


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

谢谢您的回答。这确实帮了我很大的忙,但我们不能像您更改“ServiceRate.Any(Carrier=@0)”那样更改条件字符串。那么还有别的方法吗?我不知道有什么方法(可能有)。看起来Any内的情况范围很窄。如果我有什么想法,我会在这里更新。