我在c#中面临linq查询的一个问题,我的linq查询如下
list = (from row in dt.AsEnumerable()
select new Perfmon
{
id = row.Field<long>("id"),
counter1 = row.Field<string>("counter"),
}).ToList();
我有一个 perfmon 类,它包含像(id,counter1,counter2 ......)这样的属性 现在有超过20个计数器我已经开发了sql查询来根据参数中的传递的反对来选择id和counter。如果我已经通过了counter1,那么它将只选择id,counter1(重命名为counter)
如果我在这里使用switch case那么它将有20个女巫案例,有谁可以帮助我如何在linq中动态绑定属性?
提前致谢。
答案 0 :(得分:2)
您可以使字典支持Perfmon类,而不是每个属性的字段。像:
class Perfmon
{
private readonly Dictionary<string, string> _counters = new Dictionary<string, string>();
public Perfmon(params KeyValuePair<string, string>[] knownCounters)
{
foreach (var knownCounter in knownCounters)
{
SetCounter(knownCounter.Key, knownCounter.Value);
}
}
public void SetCounter(string name, string value)
{
_counters[name] = value;
}
protected string GetCounterValue(string name)
{
if (_counters.ContainsKey(name))
return _counters[name];
else
return null;
}
public string Counter1 { get { return GetCounterValue("Counter1"); } }
public string Counter2 { get { return GetCounterValue("Counter2"); } }
public string Counter3 { get { return GetCounterValue("Counter3"); } }
}
构造函数在那里,因此您可以在查询中轻松使用它,如:
var counterName = "Counter2";
list = (from row in dt.AsEnumerable()
select new Perfmon(new KeyValuePair<string, string>(counterName, row.Field<string>("counter")))
{
id = row.Field<long>("id")
}).ToList();
答案 1 :(得分:0)
您还可以使用动态Linq 。本质是解析您的字符串并将其转换为表达式树。有关详细信息,请参阅此处
http://weblogs.asp.net/rajbk/archive/2007/09/18/dynamic-string-based-queries-in-linq.aspx
答案 2 :(得分:0)
我认为您应该查看System.Reflection
命名空间。当然,你想在linq查询中使用它,但是你现在似乎无法做的事情是从类中动态提取字段/属性。
尝试在linq查询之外使用它,然后您将找到将其集成到查询中的方法。