Изменение значений объекта в LINQ-операторе - PullRequest
1 голос
/ 07 февраля 2012

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

Я создал частичный класс и добавил нужные мне поля в объект. Затем я написал статическую функцию «AttachProperties», которая должна каким-то образом добавлять некоторые вычисляемые значения. Я не могу сделать это на стороне клиента, так как некоторые другие функции прикрепляют некоторые условия фильтра к запросу.

Функции должны выглядеть следующим образом:

return query.Select(o =>
{
   o.HasCalculatedProperties = true;
   o.Value = 2;

   return o;
});

В моем случае рассчитанное значение зависит от нескольких поисков, а не просто от "2". Этот пример работает с IEnumerable, но, конечно, не с IQueryable

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

Ответы [ 2 ]

1 голос
/ 07 февраля 2012

Попробуйте что-то вроде этого:

return from o in collection
       select new O()
       {
           OtherProperty = o.OtherProperty,
           HasCalculatedProperties = true,
           Value = 2
       };

Это создаст копию исходного объекта с необходимыми изменениями и позволит избежать всей путаницы, связанной с изменением сущности в предложении select.

1 голос
/ 07 февраля 2012

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

Но вы можете расширить свой класс с помощью методов, которые возвращают результат вычисления, например:

partial class EntityObject
{
    public int GetValue()
    {
        return this.MappedProp1 * this.MappedProp2;
    }
}

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

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