c# – 使用linq选择匿名委托
发布时间:2020-12-15 23:57:25 所属栏目:百科 来源:网络整理
导读:我知道有办法做到这一点,但我一直在撞墙试图解决这个问题.这很好用: private GenericRecord CreateGeneric(GenericRecord g,Member m){ g.Member = m; return g;}public IListGenericRecord ReportFromDatabase(DateTime startDate,DateTime endDate){ List
我知道有办法做到这一点,但我一直在撞墙试图解决这个问题.这很好用:
private GenericRecord CreateGeneric(GenericRecord g,Member m) { g.Member = m; return g; } public IList<GenericRecord> ReportFromDatabase(DateTime startDate,DateTime endDate) { List<GenericRecord> returnRecords = new List<GenericRecord>(); returnRecords.AddRange(from r in pjRepository.Records join m in memberRepository.Members on r.SID equals m.MemberId.ToString() where r.TransactionDate >= startDate && r.TransactionDate <= endDate select CreateGeneric((GenericRecord)r,m)); return returnRecords; } 但我知道有一种方法可以在没有CreateGeneric函数的情况下完成它.如何内联选择委托功能? returnRecords.AddRange(from r in pjRepository.Records join m in memberRepository.Members on r.SID equals m.MemberId.ToString() where r.TransactionDate >= startDate && r.TransactionDate <= endDate select (delegate { GenericRecord g = (GenericRecord)r; g.Member = m; return g; })); 这给了我这个例外: The type of the expression in the select clause is incorrect. Type inference failed in the call to 'Select'. 编辑:另一次尝试失败 returnRecords.AddRange((from r in pjRepository.Records join m in memberRepository.Members on r.SID equals m.MemberId.ToString() where r.TransactionDate >= startDate && r.TransactionDate <= endDate select new { r,m }).Select(x => { GenericRecord g = (GenericRecord)x.r; g.Member = x.m; return g; })); 这给了我:
解决方法
尝试:
returnRecords.AddRange((from r in pjRepository.Records join m in memberRepository.Members on r.SID equals m.MemberId.ToString() where r.TransactionDate >= startDate && r.TransactionDate <= endDate select new { r,m }).AsEnumerable().Select(x => { GenericRecord g = (GenericRecord)x.r; g.Member = x.m; return g; })); 关键不同的是AsEnumerable()函数.这需要一个IQueryable并返回一个IEnumerable,它在幕后迫使Linq提供者对表达式树进行评估.这可以防止Linq库尝试将第二个Select的lambda转换为表达式树的一部分(它说它不能);第二个Select将通过评估IQueryable表达式树对生成的实际内存集合执行转换.由于您需要在语句结束之前评估查询(因此可以将所有元素添加到returnRecords),因此应该没有显着的性能差异. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |