加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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;
                        }));

这给了我:

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),因此应该没有显着的性能差异.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读