Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Linq查询中使用动态列名 foreach(Enum.GetValues中的维度(typeof(Dimension))) { var r=新的可引用(维度)。引用项; List qry=TVRawDataList.Where(p=>!r.Any(d=>d.Value==p.BrandVariant)) .ToList(); 尺寸项目di=新尺寸项目(qry,尺寸); 新增维度。添加(di); }_C#_Linq_Dynamic - Fatal编程技术网

C# 在Linq查询中使用动态列名 foreach(Enum.GetValues中的维度(typeof(Dimension))) { var r=新的可引用(维度)。引用项; List qry=TVRawDataList.Where(p=>!r.Any(d=>d.Value==p.BrandVariant)) .ToList(); 尺寸项目di=新尺寸项目(qry,尺寸); 新增维度。添加(di); }

C# 在Linq查询中使用动态列名 foreach(Enum.GetValues中的维度(typeof(Dimension))) { var r=新的可引用(维度)。引用项; List qry=TVRawDataList.Where(p=>!r.Any(d=>d.Value==p.BrandVariant)) .ToList(); 尺寸项目di=新尺寸项目(qry,尺寸); 新增维度。添加(di); },c#,linq,dynamic,C#,Linq,Dynamic,我正在尝试创建一个Linq查询,将TVRawDataRecords列表与维度的枚举中的那些记录进行比较,如果没有匹配项,则将它们添加到新的维度em列表中。这一切都很好,但我需要在我的Where语句中动态替换p.BrandVariant,将维度枚举值作为维度值,这与TVRawDataRecord属性名称相同。这意味着我可以只使用这几行代码来循环8维等等 有人能解释一下我是如何在Where语句中包含维度的吗?谢谢 首先,这确实是一件奇怪的事情。你应该先考虑另一种设计。现在有一对夫妇来找我 无论如何,

我正在尝试创建一个Linq查询,将
TVRawDataRecords
列表与
维度的枚举中的那些记录进行比较,如果没有匹配项,则将它们添加到新的
维度em
列表中。这一切都很好,但我需要在我的
Where
语句中动态替换
p.BrandVariant
,将维度枚举值作为维度值,这与
TVRawDataRecord
属性名称相同。这意味着我可以只使用这几行代码来循环8维等等


有人能解释一下我是如何在Where语句中包含维度的吗?谢谢

首先,这确实是一件奇怪的事情。你应该先考虑另一种设计。现在有一对夫妇来找我

无论如何,你可以通过反思来实现你想要实现的目标。,几乎

foreach (Dimension dimensions in Enum.GetValues(typeof(Dimension)))
{
    var r = new ReferenceTable(dimensions).referenceItems;
    List<TVRawDataRecord> qry = TVRawDataList.Where(p => !r.Any(d => d.Value == p.BrandVariant))
                                             .ToList();                
    DimensionItem di = new DimensionItem(qry, dimensions);
    newDimensions.Add(di); 
 }
优点是,即使将来更改任何变量的名称,代码也不会中断(与反射方法不同)。但是这里的问题是选择返回类型
T
。第二个示例无法编译,因为返回类型与返回的类型不匹配。如果所有属性的类型相同,则可以选择该类型。如果它确实是可变的,那么您必须首先将属性强制转换为object,然后再转换为
T
,但仍然比反射更好

更好的方法是指定属性或


最重要的是,如果
BrandVariant
Creative
等是它们自己的类,您可以让它们都实现一个接口,该接口上有一个只读
维度
,您可以访问电视录制属性的属性,以获得正确的维度值

为什么不在代码中用维度值替换属性?当你这样做时会发生什么?什么不起作用?维度值是我要查找的字段的名称,所以我基本上尝试在每个循环中用“p+维度”替换p.BrandVariant。这只是编译。你检查过自己了吗?你是说
p.Dimension
Dimension
enum一致?这根本不是问题?你试过了吗?我的问题是在每个foreach循环上用等价的'p.+维度”,因此第一个过程将是p.BrandVariant,然后是p.Creative,依此类推-每个枚举一个。所以我认为问题是如何动态更新Where语句。那么p.Property和维度enum之间的联系是什么呢?哪个枚举值映射到p的哪个属性?或者他们只是一个接一个的,等等?
foreach (Dimension dimension in Enum.GetValues(typeof(Dimension)))
{
    var r = new ReferenceTable(dimension).referenceItems;
    var qry = TVRawDataList.Where(p => !r.Any(d => IsAMatch(p, dimension, d.Value)))
                           .ToList();     

    DimensionItem di = new DimensionItem(qry, dimension);
    newDimensions.Add(di); 
}

bool IsAMatch<T>(TVRawDataRecord obj, Dimension dimension, T valueToMatch)
{
    return valueToMatch == dimension.MapToTvRecordProperty<T>(obj);
}

T MapToTvRecordProperty<T>(this Dimension dimension, TVRawDataRecord obj)
{
    return obj.GetPropertyValue<T>(dimension.ToString());
}

T GetPropertyValue<T>(this TVRawDataRecord obj, string propertyName)
{
     var property = typeof(TVRawDataRecord).GetProperty(propertyName);
     if (property == null)
         return null; //or throw whatever

     return (T)property.GetValue(obj, null);
}
T MapToTvRecordProperty<T>(this Dimension dimension, TVRawDataRecord obj)
{
    switch (dimension)
    {
        case Dimension.BrandVariant:
            return obj.BrandVariant;
        case Dimension.Creative:
            return obj.Creative;

        .....

        default:
            throw;
    }
}