在Linq查询中使用动态列名称
foreach (Dimension dimensions in Enum.GetValues(typeof(Dimension))) { var r = new ReferenceTable(dimensions).referenceItems; List qry = TVRawDataList.Where(p => !r.Any(d => d.Value == p.BrandVariant)) .ToList(); DimensionItem di = new DimensionItem(qry, dimensions); newDimensions.Add(di); }
我正在尝试创建一个Linq查询,将TVRawDataRecords
列表与TVRawDataRecords
枚举中的列表进行比较,如果没有匹配,则将它们添加到新的DimensionIem
列表中。 这一切都运行正常,但我需要动态p.BrandVariant
我的Where
语句中的p.BrandVariant
和维度枚举值,因为维度值与TVRawDataRecord
属性名称相同。 这意味着我可以只用这几行代码来循环8个维度等。
有人可以解释我在Where语句中包含维度的方式吗? 谢谢!
首先,这真的是一件奇怪的事情。 您应该首先考虑替代设计。 现在有一对夫妇来找我。
无论如何,你可以使用reflection来实现你想要实现的目标。 ,差不多……
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(TVRawDataRecord obj, Dimension dimension, T valueToMatch) { return valueToMatch == dimension.MapToTvRecordProperty (obj); } T MapToTvRecordProperty (this Dimension dimension, TVRawDataRecord obj) { return obj.GetPropertyValue (dimension.ToString()); } T GetPropertyValue (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); }
严格未经测试,未编译。 但这应该让人知道它是如何完成的。 您可以使GetPropertyValue
函数更通用,但这是另一回事。 传递Map
函数中的T
类型参数(将维度枚举映射到TVRawDataRecord
类的属性),因为您需要知道属性的返回类型。
我想说一个更好的替代设计就是创建一个简单的函数,使用if else逻辑来返回正确的类型 。 所以将Map
function更改为:
T MapToTvRecordProperty(this Dimension dimension, TVRawDataRecord obj) { switch (dimension) { case Dimension.BrandVariant: return obj.BrandVariant; case Dimension.Creative: return obj.Creative; ..... default: throw; } }
优点是,即使将来更改任何变量的名称,您的代码也不会中断(与reflection方法不同)。 但这里的问题是选择返回类型T
第二个例子不会编译,因为返回类型与返回的内容不匹配。 如果所有属性属于同一类型,则可以选择该类型。 如果它真的变化了,那么你必须首先将你的属性转换为object然后转换为T
,但仍然比reflection更好!
更好的方法是指定属性或枚举 属性 。
最重要的是,如果BrandVariant
和Creative
等都是他们自己的类,你可以让他们都实现一个接口,在它们上面只有一个属性readonly Dimension
,你可以访问你的tv记录属性的属性,以获得正确的维度值!
上述就是C#学习教程:在Linq查询中使用动态列名称分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/943022.html