首页 / C# / c# – 使用linq选择匿名委托
c# – 使用linq选择匿名委托
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 使用linq选择匿名委托,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2125字,纯文字阅读大概需要4分钟。
内容图文
![c# – 使用linq选择匿名委托](/upload/InfoBanner/zyjiaocheng/760/83f3fa86860740f3aed58deeb74260af.jpg)
我知道有办法做到这一点,但我一直在撞墙试图解决这个问题.这很好用:
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;
}));
这给了我:
A lambda expression with a statement body cannot be converted to an expression tree.
解决方法:
尝试:
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),因此应该没有显着的性能差异.
内容总结
以上是互联网集市为您收集整理的c# – 使用linq选择匿名委托全部内容,希望文章能够帮你解决c# – 使用linq选择匿名委托所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。