[英]select anonymous delegate with linq
我知道有辦法做到這一點,但我一直在撞牆試圖解決這個問題。 這很好用:
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;
}));
這給了我:
具有語句主體的lambda表達式無法轉換為表達式樹。
嘗試:
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),因此應該沒有顯着的性能差異。
Seem like this is what you are looking at:
class Bila
{
public string Name;
public List<string> Adresses;
}
var justNumbers = Enumerable.Range(0, 10);
Func<int,List<string>> foo = delegate(int j)
{
List<string> lst = new List<string>();
for (int kk = 0; kk < j; kk++)
{
lst.Add("String_" + kk.ToString());
}
return lst;
};
var zilla3 = (from x in justNumbers
select new Bila
{
Name = "Name_" + x.ToString(),
Adresses = foo(x),
}).ToArray();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.