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查询,它选择匿名类型类中的值。 我只想将此查询传递给somemethod()并在该方法中存储在“emp”中的此查询上调用toList()。 谢谢!
答案 0 :(得分:1)
您不能以强类型方式传递匿名类型(仅作为对象)。您必须创建一个类型来表示匿名类型结构,对对象类型使用反射,或者在此方法中执行ToList()等工作。
答案 1 :(得分:1)
有可能以一种不关心它是否是匿名类型的方式执行此操作 - 如果您通过一种方法来挑选相关属性,您甚至可以对其进行一些处理。
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);
答案 2 :(得分:0)
您可以将其作为IQueryable<dynamic>
public void SomeQueryMethod(IQueryable<dynamic> query)
{
var result = query.First();
var a = result.a; //dynamic resolution
}
....
SomeQueryMethod(emp); //this should work
但是在方法中,对结果对象的所有属性访问都是“动态的”,没有编译时间检查。