2012-03-21 5 views
0

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

Я начинаю получать одну строку из запроса 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() метод в основном присваивает возвращаемое значение в WebControl (и имеет логику, чтобы определить тип и как он должен быть назначен и т.д ..)

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

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

Спасибо заранее, Марк

+5

C# не «взрывается», он выдает исключения. Исключения включают, помимо прочего, тип, сообщение и трассировку стека. – Jon

+0

Да, лучший способ действительно нужен, вы используете Reflection в цикле. Это дорогостоящая операция. Я жду ответа экспертов – Zenwalker

+0

Почему вы активно пытаетесь сбросить безопасность типов? – asawyer

ответ

1

Первое:

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 = ... 

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

+0

Спасибо, или подробный ответ, сейчас я попробую. Причина такова: у разметки есть свои текстовые поля, флажок, выпадающий список и т. Д. ... все с именем, имеющим имя столбца базы данных. Когда форма загружается, она проходит через webcontrols и строит список имен столбцов. Затем их можно использовать для создания обновлений и вставок SQL. И при загрузке данных у меня есть имена столбцов, о которых идет речь, поэтому просто нужно ссылаться на запрашиваемый объект. Это звучит все больше и больше, как я должен придерживаться старых datarows для этого? – RemarkLima

+0

'все с именем, помеченным именем столбца базы данных'. Вы в порядке, предоставляя интимную подробную информацию о схемах о ваших таблицах данных всем, кто загружает вашу страницу? Если бы это произошло в обзоре кода, я бы * настоятельно советовал об этом. – asawyer

+0

Похоже, вы пытаетесь воссоздать 'FormView' по какой-то причине. http://msdn.microsoft.com/en-us/library/fyf1dk77(v=vs.85).aspx – asawyer

2

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

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

+0

Все начинается с щелчка! Я никогда раньше не работал с Linq, поэтому подумал, что пришло время застрять! Такая информация неоценима. Легко увлечься шумихой, что «Linq делает все!», Когда некоторые из старых методов также будут делать. – RemarkLima

Смежные вопросы