2015-03-25 99 views
12

我映射POCO到模型中,示出以下聲明變量(X =>新

var noneRequiredUserDocuments = new List<NoneRequiredUserDocument>(); 
var docs = studentDocuments.Where(x => x.RequiredUserDocumentId == null).ToList(); 
noneRequiredUserDocuments = docs.Select(x => new NoneRequiredUserDocument 
    { 
     StudentDocument = x, 
     Src = _storageService.GetFileUrl(x.FileName), 
     ThumbnailImageUrl = ImageHelper.ThumbnailImageUrl(Src, 75) 

    }).ToList(); 

我的問題是代碼,在該行ThumbnailImageUrl = ImageHelper.ThumbnailImageUrl(SRC,75) ,Src在上下文中不存在。有沒有辦法讓我在select中聲明一個變量,以便在linq select中重用?我不想調用_storageService.GetFileUrl兩次。

謝謝

回答

24

可以聲明一個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.. 
+1

然後在'Src ='部分中使用它,只是爲了美觀。 – 2015-03-25 09:24:53

+0

@HenkHolterman - Duh!謝謝更正:) – 2015-03-25 11:33:06

2

您可以引入匿名類型的臨時集合w第i所有必要的數據:

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(); 
+0

爲什麼他需要使用匿名類型,如果他能在拉姆達使用局部變量? – 2015-03-25 08:57:19

+0

@AlexSikilinda,因爲它可以做到這一點 – 2015-03-25 08:59:02

+1

既然你可以使用匿名和強類型的方法 - 我認爲後者應該是首選的方法。 – Veverke 2015-03-25 09:34:55

5

您可以創建一個常規的代碼塊,而不是在lambda表達式中運行單個語句,這樣你可以聲明一個變量「src」,它將在整個塊 - 遵循常規範圍規則。

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

您可以使用「讓」的文章:

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();