Lambda复合加入

Nic*_*Egg 0 c# lambda join

我正在尝试加入一个查询的结果来过滤第二个查询的结果.

第一次查询

// get the compound centre number and languageId key
var centreKeys = unitOfWork.CentreTranslationRepository.GetAll()
    .Where(w => w.Language.cuture == searchCulture || w.language_id == 1)
    .GroupBy(g => g.Centre.number)
    .Select(s =>
        new
        {
            CentreNumber = s.Key,
            LanguageId = s.Max(g => g.language_id)
        });
Run Code Online (Sandbox Code Playgroud)

这将返回以下形式的结果:

{ CentreNumber = 1589, LanguageId = 27 }

{ CentreNumber = 261, LanguageId = 1 }  

{ CentreNumber = 1257, LanguageId = 1 }

{ CentreNumber = 925, LanguageId = 1 }  
Run Code Online (Sandbox Code Playgroud)

等等

第二个查询

// join onto the translated table
var centres = unitOfWork.CentreTranslationRepository.GetAll()
    .Join(centreKeys,
          centreTranslation => new { centreTranslation.Centre.number, centreTranslation.language_id },
          centreKey => new { centreKey.CentreNumber, centreKey.LanguageId },
          (centreTranslation, centreKey) =>
              new Centre
              {
                  CentreNumber = centreTranslation.Centre.number,
                  name = centreTranslation.Centre.name
                  // etc
              });
Run Code Online (Sandbox Code Playgroud)

使用单个键执行连接可以正常工作,但如上所示,我正在尝试使用匿名组合键进行连接.

这是我收到错误时:

Error   1   The type arguments for method 'System.Linq.Enumerable.Join<TOuter,TInner,TKey,TResult>(System.Collections.Generic.IEnumerable<TOuter>, System.Collections.Generic.IEnumerable<TInner>, System.Func<TOuter,TKey>, System.Func<TInner,TKey>, System.Func<TOuter,TInner,TResult>)' cannot be inferred from the usage. Try specifying the type arguments explicitly.    C:\Development\SVN\Projects\CentreDirectoryService\CentreDirectoryService\Services\DomainService.cs 32  65  CentreDirectoryService 
Run Code Online (Sandbox Code Playgroud)

我在第二个查询中做错了什么?

Aak*_*shM 6

这个:

new { centreTranslation.Centre.number, centreTranslation.language_id }
Run Code Online (Sandbox Code Playgroud)

还有这个:

new { centreKey.CentreNumber, centreKey.LanguageId }
Run Code Online (Sandbox Code Playgroud)

定义不同匿名类型的对象.为了统一匿名类型,他们需要成员具有相同的名称,相同的类型和相同的顺序.如果你不提供成员名称,编译器使用附带的表情,所以首先与成员类型numberlanguage_id,第二使与成员类型CentreNumberLanguageId.

尝试将第一个更改为

new {
        CentreNumber = centreTranslation.Centre.number, 
        LanguageId  = centreTranslation.language_id 
    }
Run Code Online (Sandbox Code Playgroud)

(并进行必要的下游变更).