Объявите переменную в LINQ select (x => new

Я сопоставляю POCO с моделью, код показан ниже.

// NOT NEEDED var noneRequiredUserDocuments = new List<NoneRequiredUserDocument>();
//var docs = studentDocuments.Where(x => x.RequiredUserDocumentId == null); // NOT NEEDED .ToList();
//var noneRequiredUserDocuments = docs.Select(x => new NoneRequiredUserDocument

// You can chain LINQ methods (i.e. Where and Select)
var noneRequiredUserDocuments = studentDocuments
    .Where(x => x.RequiredUserDocumentId == null)
    .Select(x => new NoneRequiredUserDocument
    {
        StudentDocument = x,
        Src = _storageService.GetFileUrl(x.FileName),
        ThumbnailImageUrl = ImageHelper.ThumbnailImageUrl(Src, 75)

    }).ToList();

Моя проблема в том, что в этой строке:

ThumbnailImageUrl = ImageHelper.ThumbnailImageUrl(Src, 75)

Src не существует в контексте.

Есть ли способ для меня объявить переменную внутри выбора, который я могу повторно использовать в выборе LINQ?

Я не хочу дважды вызывать _storageService.GetFileUrl.

Спасибо

Ответ 1

Вы можете объявить переменную внутри Select следующим образом: -

noneRequiredUserDocuments = docs.Select(x => 
  {
      var src= _storageService.GetFileUrl(x.FileName);
      return new NoneRequiredUserDocument
     {
        StudentDocument = x,
        Src = src,
        ThumbnailImageUrl = ImageHelper.ThumbnailImageUrl(src, 75);
     };
  }).ToList();

В query syntax выполнение этого эквивалентно: -

from x in docs
let src= _storageService.GetFileUrl(x.FileName)
select and so on..

Ответ 2

Вы можете использовать ключевое слово "let":

var list = (from x in docs
            let temp = _storageService.GetFileUrl(x.FileName)
            select new NoneRequiredUserDocument
            {
                StudentDocument = x,
                Src = temp,
                ThumbnailImageUrl = ImageHelper.ThumbnailImageUrl(temp, 75)
            }).ToList();

Ответ 3

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

noneRequiredUserDocuments = docs.Select(x => {
      var  src = _storageService.GetFileUrl(x.FileName);
      return 
             new NoneRequiredUserDocument
             {
                 StudentDocument = x,
                 Src = src,
                 ThumbnailImageUrl = ImageHelper.ThumbnailImageUrl(Src, 75)
              };
    }).ToList();

Ответ 4

Вы можете ввести временную коллекцию анонимного типа со всеми необходимыми данными:

noneRequiredUserDocuments = docs
   .Select(x => new { Data = x, Src = _storageService.GetFileUrl(x.FileName) }
   .Select(x => new NoneRequiredUserDocument
   {
       StudentDocument = x.Data,
       Src = x.Src
       ThumbnailImageUrl = ImageHelper.ThumbnailImageUrl(x.Src, 75)
   }).ToList();