Linq - получение значения из строки - PullRequest
0 голосов
/ 21 марта 2012

Первый вопрос по SO - я читал его много, много раз, поэтому пришло время заглянуть и промокнуть в сообществе!

Я начинаю с получения одной строки из запроса Linq:

var relationshipDetails = (from p in dc.tbl_ClientRelationships
                           where p.ID == relationship_id
                           select p).FirstOrDefault();

Затем я просматриваю список строк (_cols), который представляет собой известные имена столбцов (а также имена элементов формы), например:

foreach (string c in _cols)
    {
      if (relationshipDetails.GetType().GetProperty(c).GetValue(relationshipDetails, null).ToString() != null)
        {
           setValue(relationshipDetails.GetType().GetProperty(c).GetValue(relationshipDetails, null).ToString(), c);
         }
     }

метод setValue() в основном присваивает возвращаемое значение веб-контролю (и имеет логику для определения типа и способа его назначения и т. Д.)

Мой вопрос, есть ли лучший способ получить значение из объекта Linq из известного значения свойства? Он работает на некоторых формах, но недавно только взорвался от меня!

В противном случае, я испытываю желание вернуться к старому методу или вернуть DataRow из DAL и просто ссылаться по имени!

Заранее спасибо, Mark

Ответы [ 2 ]

2 голосов
/ 21 марта 2012

Одним из самых больших (на мой взгляд) преимуществ Linq для (Sql / Entities) является то, что возвращаемые объекты строго типизированы .Вы используете LinqToX, а затем используете рефлексию для присвоения значений, в основном вы делаете то, что делала старая школа DataRow.

Я не уверен, почему вы пытаетесь динамически назначать значения.Это определенно проблема XY .

1 голос
/ 21 марта 2012

Первый:

var relationshipDetails = (from p in dc.tbl_ClientRelationships
                          where p.ID == relationship_id
                          select p).FirstOrDefault();

Linq-запросы - это объекты, которые представляют запрос, отделяют их и отличаются от результатов этих запросов.В этом случае я бы предложил что-то вроде этого:

var relationshipDetails = dc.tbl_ClientRelationships
                              .FirstOrDefault( p => p.Id == relationship_id);

Теперь это будет очень медленно:

foreach (string c in _cols)
{
  if (relationshipDetails.GetType().GetProperty(c).GetValue(relationshipDetails, null).ToString() != null)
    {
       setValue(relationshipDetails.GetType().GetProperty(c).GetValue(relationshipDetails, null).ToString(), c);
     }
 }

Вы можете легко получить ссылку на элементы отраженияи сократить накладные расходы, может быть, что-то вроде этого: (Не может быть 100% правильный синтаксис)

var properties = relationshipDetails.GetType().GetProperties();

foreach (string c in _cols)
{
    var currentProperty = properties.Single( p=> p.Name == c );

    if (currentProperty.GetValue(relationshipDetails, null) != null)
    {
        setValue(currentProperty.GetValue(relationshipDetails, null).ToString(), c);
    }
}

Наконец - зачем вы это делаете?Пожалуйста, подробно опишите, что вы пытаетесь сделать, и почему обращение к столбцам в безопасном именованном виде, например:

relationshipDetails.Id = ...
relationshipDetails.SomethingElse = ...
relationshipDetails.AnotherThing = ...

Не будет работать в вашем случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...