在LINQ中声明变量:select(x => new)。

44

我正在将一个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

4个回答

83

您可以在 Select 语句内部这样声明一个变量:

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

在查询语法中,这样做等同于:

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

2
然后在 Src = 部分中也使用它,仅为美观考虑。 - H H

15

您可以使用“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();

10

您可以创建一个常规的代码块,而不是在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
您可以引入一个临时的匿名类型集合,包含所有必要的数据:
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();

他为什么需要在lambda中使用匿名类型,如果他可以使用局部变量呢? - Alex Sikilinda
@AlexSikilinda,因为这是其中一种可能的做法。 - Konrad Kokosa
1
既然你可以使用匿名和强类型的方法,我认为后者应该是首选方法。 - Veverke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接