Lambda复合接头
本文关键字:复合 Lambda | 更新日期: 2023-09-27 17:57:50
我正试图连接一个查询的结果,以过滤第二个查询的查询结果。
首次查询
// 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)
});
这将以以下形式返回结果:
{ CentreNumber = 1589, LanguageId = 27 }
{ CentreNumber = 261, LanguageId = 1 }
{ CentreNumber = 1257, LanguageId = 1 }
{ CentreNumber = 925, LanguageId = 1 }
etc
第二次查询
// 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
});
使用单个键执行联接不会出现问题,但是如上所示,我尝试使用匿名复合键进行联接。
这就是我得到错误的时候:
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
我在第二个查询中做错了什么?
这:
new { centreTranslation.Centre.number, centreTranslation.language_id }
这个:
new { centreKey.CentreNumber, centreKey.LanguageId }
定义不同匿名类型的对象。为了统一匿名类型,它们需要其成员具有相同的名称、相同的类型和相同的顺序。如果不提供成员名称,编译器将使用提供的表达式,因此第一个表达式生成具有成员number
和language_id
的类型,第二个表达式生成成员CentreNumber
和LanguageId
的类型。
尝试将第一个更改为
new {
CentreNumber = centreTranslation.Centre.number,
LanguageId = centreTranslation.language_id
}
(并进行必要的下游更改)。