gpt4 book ai didi

c# - 使用 linq 选择匿名委托(delegate)

转载 作者:行者123 更新时间:2023-11-30 13:28:36 25 4
gpt4 key购买 nike

我知道有办法做到这一点,但我一直在用头撞墙试图找出答案。这很好用:

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 函数的情况下做到这一点。如何选择内联委托(delegate)函数?

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

这给了我这个异常(exception):

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 表达式树生成的实际 im-memory 集合执行转换。由于无论如何都需要在语句结束之前对查询进行评估(因此所有元素都可以添加到 returnRecords),因此应该没有显着的性能差异。

关于c# - 使用 linq 选择匿名委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4900380/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com