2016-07-01 2 views
1

Если у меня есть объект A со многими свойствами, из которого мне нужна только пара, я могу повысить производительность, не перенося ненужные данные, т. Е. Выбирать только те свойства, которые мне нужны, новый тип B, названный или анонимный.LINQ: выберите определенные свойства объекта В тот же объект

Теперь представьте себе, что я хочу связать список этих исходных объектов A, скажем, с datagridview, который отображает только пару свойств, которые я хочу. Я создал столбцы datagridview, используя имена свойств исходного объекта A и установил его тип источника данных typeof (A). Мне было интересно, если я могу выбрать в тот же объект А просто опуская свойства мне не нужно, т.е.

public class MyObject 
{ 
    public string prop1 { get; set; } 
    public string prop2 { get; set; } 
    ..... 
    public string propN { get; set; } 
} 

var list = context.MyObject 
     .Select(n => new MyObject { prop1 = n.prop1, prop2 = n.prop2 }).ToList(); 

Таким образом, мне не нужно, чтобы определить новый тип, либо по имени или анонимно. Вопрос в том, что я получаю что-то в производительности, или у меня все еще есть накладные расходы на исходную большую информацию об объекте A, хотя я не передаю данные для всех своих свойств.

Alex

+0

Благодарим всех вас за ответы. –

ответ

1

Единственное значимое увеличение производительности, если ваш конструктор «дешево», находится в SQL и переносе данных с/на.

Это не все касается производительности. Иногда речь идет о ясности, расширяемости, развязке и т. Д. Ясность мудрая, вы вынуждаете других задавать вопрос «Является ли это свойство используемым пользовательским интерфейсом?»

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

public interface IMyModel 
{ 
    string prop1 { get; set; } 
    string prop2 { get; set; } 
} 

public class MyObject : IMyModel 
{ 
    public string prop1 { get; set; } 
    public string prop2 { get; set; } 
    ..... 
    public string propN { get; set; } 
} 

IEnumerable<IMyModel> list = context.MyObject 
    .Select(n => new { n.prop1, n.prop2 }) // only select these properties 
    .ToArray() // execute the query 
    .Select(n => (IMyModel)new MyObject { prop1 = n.prop1, prop2 = n.prop2 }); // construct our desired object 
+0

Я полагаю, что этот вопрос возник из-за моего незнания об отключении пользовательского интерфейса из моего внутреннего интерфейса. Если мои сущности определены в моем конце, и мне нужно показать какие-то объекты «dto» в моем пользовательском интерфейсе, где должны быть определены эти параметры (что-то вроде IMyModel вашего ответа?)? Я полагаю, что и мой пользовательский интерфейс, и интерфейс должны знать о них, так что я должен определить их на третьем уровне между ними? –

+0

Если мы предположим, что у вас есть одна сборка для всего кода пользовательского интерфейса, отдельная сборка, содержащая ваш доступ к данным и сущности, то IMyModel и все, что ее реализует, могут находиться в сборке пользовательского интерфейса (или сборке, на которую ссылается только сборка пользовательского интерфейса). Где-то вам нужно сопоставить свой объект данных с объектом пользовательского интерфейса, и везде, где это происходит, ваш код должен знать об обоих. –

3

На самом деле, я думаю, производительность не может улучшить много, как выбрать заявление будет пройти через все свой список и создать новый список объектов для вас. Но если у вас есть ссылочное свойство, которое вы не используете. Вы можете сохранить там.

Если нет сложной логики при отображении данных в пользовательский интерфейс. Сыворотка, ты не держишь модель такой, какой она есть.

+0

Некоторые объекты имеют ссылочные свойства, а другие нет, но они могут иметь большое свойство строки, которое мне не нужно показывать в моем документе datagridview. –

2

Если это только для отображения пользовательского интерфейса - нет коэффициента усиления производительности. В любое время, когда вы можете выиграть, вы проиграете, создав новый список анонимных типов.

Однако, если вы намерены отправить этот объект через сеть (в качестве ответа на запрос, например), это имеет смысл. Таким образом, меньшее количество свойств должно быть сериализовано и отправлено по сети.

В большинстве случаев, однако, вы должны беспокоиться о производительности на этом уровне. Пользователь не заметит улучшения на таком уровне. Если вы действительно хотите улучшить производительность своего приложения, вы должны просмотреть его и найти горячие точки.

+0

Да, я полагаю, я должен начать использовать профилирование, которое я еще не сделал, что даст мне реальный ответ. –

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