将linq选择查询传递给方法
本文关键字:方法 查询 linq 选择 | 更新日期: 2023-09-27 18:16:02
var emp = (from a in AdventureWorks.PersonPhones
join b in AdventureWorks.People
on a.BusinessEntityID equals b.BusinessEntityID
join c in AdventureWorks.PhoneNumberTypes
on a.PhoneNumberTypeID equals c.PhoneNumberTypeID
select new { a, b, c }).OrderBy(n => n.c.Name);
我有这个linq查询,它选择匿名类型类中的值。我只是想将这个查询传递给someemethod(),并在该方法中存储在"emp"中的这个查询上调用toList()。谢谢!
可以用一种不关心它是否是匿名类型的方式来做到这一点——如果你传递一个方法来挑选相关的属性,你甚至可以对它做一些工作。
private static void Process<T>(IEnumerable<T> data, Func<T, string> selector) {
foreach (var item in data) {
Console.WriteLine(selector(item));
}
}
var items = from i in db.table
select new { property = i.originalProperty, ignored = i.ignored };
Process(items, (item => item.property));
另一种方法是选择你想要的属性到一个新的列表
var items = from i in db.table
select new { prop1 = i.prop1, prop2 = i.prop2 };
// ... cut ... do something that requires everything in items ...
IEnumerable<string> justFirstProperties = items.Select(i => i.prop1);
Process(justFirstProperties);
不能以强类型的方式传递匿名类型(只能作为对象)。您必须创建一个类型来表示匿名类型结构,在对象类型上使用反射,或者在此方法中执行ToList()等操作。
您可以将其作为IQueryable<dynamic>
public void SomeQueryMethod(IQueryable<dynamic> query)
{
var result = query.First();
var a = result.a; //dynamic resolution
}
....
SomeQueryMethod(emp); //this should work
但是在该方法中,对结果对象的所有属性访问将是"动态的",没有编译时检查。