2015-03-25 97 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();