2014-05-23 4 views
0

Сценарий таков: - EF хранимая процедура возвращает 5 столбцов в DataResult - Все, что мне нужно, это 3 колонки, поэтому я закодированыКак получить имена только выбранных свойств?

var data = (from i in db.GetDataResult() 
       select new DataResult 
       { 
        prop1 = i.prop1, 
        prop2 = i.prop2, 
        prop3 = i.prop3, 
        }).ToList(); 
  • Без жесткого кодирования названий строк, я хотел бы получить имена выбранных столбцов, которые являются prop1, prop2 и prop3.

Как достичь этого программно?

+0

'typeof (DataType) .GetProperties(). Где (p => p.Name.Содержит («что-то»)). Выберите (p => p.Name) 'вернет имена всех свойств, содержащих« что-то ». Вы можете использовать это предложение 'Where()' для фильтрации на что угодно. Вместо 'select new DataResult' вы можете использовать анонимный объект, который просто содержит поля, которые вы ищете. Например, http://stackoverflow.com/questions/3645494/how-can-anonymous-types-be-created-using-linq-with-lambda-syntax. – Steve

+0

Если я выбираю анонимный, я получаю ошибку, которая не может преобразовать anonymoustype в IList или IEnumerable. Но что тогда было бы полезно использовать анонимность над указанием типа? – usefulBee

+0

Он также работает над анонимным типом: var s = x.GetType(). GetProperties(). Где (p => p.Name.Contains («something»)). Выберите (p => p.Name) .FirstOrDefault(); ' – sallushan

ответ

1

Я думаю, что понимаю. Вы говорите, что вам не нужен фильтр, вы уже это сделали; вы хотите получить сопоставленное имя столбца. Сначала см. this answer.

Это говорит, на основе ответа @John Арлен в:

foreach (var prop in data[0].GetType().GetProperties()) 
{ 
    Console.WriteLine("{0}, Type {1}", prop.Name, prop.PropertyType); 
} 

Проблема здесь заключается в том, что это должно нормально дать вам:

prop1, *some type* 
prop2, *some type* 
prop3, *some type* 

Путаница в том, что вы каким-то образом указать столбцы перед вами знать имена, и все же в вашем примере кода вы :, используя имена столбцов. Указанные столбцы должны совпадать с именами столбцов; prop1 в вашем коде должен соответствовать столбцу prop1 в источнике данных. Вы подразумевали, что хотите отфильтровать, какие столбцы получить (а какие столбцы - , а не get), основанные на именах столбцов.

Таким образом, предполагается, что вы уже заранее знаете , какие нумерации вы должны найти по следующим другим (неуказанным) критериям:; то есть, если вы знаете, что получаете prop1, prop2 и prop3, но не propX или propY. Очевидно, вы не можете получить имена столбцов/свойств до, вы фильтруете столбцы/свойства, если вы не знаете имена.

Редактировать

Это происходит со мной, что вы можете хотеть, чтобы определить, какие поля наполняется, и которые не являются. Это может работать, если вы знаете , что ни одно из полей не равны нулю:

foreach (var prop in data[0].GetType().GetProperties()) 
{ 
    if (prop.GetValue(data[0], null) != null) 
     Console.WriteLine("{0}, Type {1}", prop.Name, prop.PropertyType); 
} 

Edit 2

Также см this SO question.

+0

Спасибо за ваше упорство. data [0] .GetType(). GetProperties() на основе нулевого или не нулевого значения, что именно то, что мне нужно - я не видел эту часть в ответе Джона. И вы правы, что я заранее знал, какие столбцы мне нужны, основываясь на «неопределенных» критериях - я думал, что это ясно - моя ошибка. И в отношении примера я предполагаю, что вы знаете, что prop1, 2 и 3 не являются жестко закодированными строками, или, другими словами, вы можете их захватить с помощью intellisense. Спасибо за полезные ссылки. – usefulBee

1

Как указано Стивом, то где() может быть использован для фильтрации:

List<string> names = GetDesiredListOfNamesSomehow(); 
var props = typeof(DateTime).GetProperties() 
     .Where(i => names.Contains(i.Name)).Select(i => i.Name); 
foreach (var prop in props) 
{ 
    Console.WriteLine("Prop Name: " + prop); 
} 

Однако, если вы знаете имена для фильтрации, вам не нужно просить имена. Поэтому я предполагаю, что вы сами пытаетесь получить фактические свойства:

var props = typeof(DateTime).GetProperties().Where(i => names.Contains(i.Name)); 
foreach (var prop in props) 
{ 
    Console.WriteLine("{0}, Type {1}", prop.Name, prop.PropertyType); 
} 
+0

Но это все равно потребует вручную записывать имена свойств вручную как строки - как и в новой строке [] {« Дата »,« День »,« DayOfWeek »}; Тем не менее, я ищу, чтобы получить имена prop1, prop2 и prop3 из данных var, как упоминалось в основном примере, чтобы избежать беспорядка со строками. – usefulBee

+1

Как вы планируете идентифицировать * какие свойства вы хотите? –

+0

Вот чего я пытался добиться. Первый шаг состоял в том, чтобы выбрать или фильтровать только те столбцы/свойства, которые мне нужны из хранимого в базе данных Proc, как это было во втором примере кода в основном сообщении ... Во-вторых, я надеялся, что использование отражения или любой другой техники для получить имена свойств/столбцов, которые я выбрал/отфильтровал на первом шаге. – usefulBee

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