Я не использую EF, так что это может отличаться в вашем конкретном случае использования, но, похоже, это вопрос о выражениях LINQ больше, чем что-либо еще.
Первая большая проблема заключается в том, что вы пытаетесьиспользуйте Expression<Func<ApplicationUser, int, SearchResultItemViewModel>>
там, где вы действительно имели в виду Expression<Func<ApplicationUser, SearchResultItemViewModel>>
, и это не будет делать то, что вы хотите.Вместо привязки к переменной вы вызываете индексированный вариант Select
.Поэтому вместо получения одинакового значения i
для всех строк вы получите индекс строки.
Когда вы создаете выражение, ссылающееся на переменную, происходит одно из двух.Для локальных переменных (и параметров) значение копируется в экземпляр анонимного класса, который связан с выражением, поэтому вы не сможете изменить его впоследствии.Для других переменных выражение содержит ссылку на саму переменную, а также содержащий объект для нестатических переменных.
Это означает, что в принципе вы можете использовать статическую переменную для изменения параметра и никогда не должнывоссоздайте выражение проекции.Конечно, бывают случаи, когда это полезно.
С другой стороны, ваш код выше создает новый экземпляр каждый раз, когда вы обращаетесь к свойству Projection
.Так почему бы просто не изменить его на функцию и сгенерировать нужное вам выражение, когда вам это нужно?
public static Expression<Func<ApplicationUser, SearchResultItemViewModel>> Projection(int parm)
=> item => new SearchResultItemViewModel
{
Id = item.Id,
Article = item.FirstName + parm.ToString()
};
Каждый раз, когда вы вызываете метод, вы получаете выражение, которое использует указанное значение.
Или вы могли бы использовать посетитель выражения, чтобы взять шаблонное выражение и изменить константы в нем так, как вам нужно в данный момент.Забавно, но я думаю, что это немного выходит за рамки.