Я столкнулся с одной проблемой с запросом 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-запрос для выбора идентификатора и счетчика на основе пройденного шаблона в параметре, например. если я прошел counter1, тогда он будет выбирать id, counter1 (переименованный в качестве счетчика) только
если я буду использовать случай переключения здесь, тогда он будет иметь 20 случаев ведьмы, может кто-нибудь, пожалуйста, помогите мне, как можно связать свойство динамически в linq?
Спасибо заранее.
Вы можете сделать свой класс 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();
Я думаю, вы должны заглянуть в пространство имен System.Reflection
. Конечно, вы хотите использовать его в запросе linq, но на данный момент вы не можете ничего сделать, чтобы динамически извлекать поле/свойство из класса.
Попробуйте использовать его вне запроса linq, а затем вы найдете способ его интеграции в ваш запрос.
Вы также можете использовать Динамический Linq. Суть состоит в том, чтобы проанализировать вашу строку и преобразовать ее в деревья выражений. Подробнее см. Здесь
http://weblogs.asp.net/rajbk/archive/2007/09/18/dynamic-string-based-queries-in-linq.aspx