2013-05-29 84 views
1
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()。 谢谢!通过linq选择查询的方法

+0

http://stackoverflow.com/questions/55101/how-can-i-pass- an-anonymous-type-to-a-method http://stackoverflow.com/questions/6624811/how-to-pass-anonymous-types-as-parameters – dugas

+0

您可以将此类型表示为'IEnumerable '。虽然我不确定您是否可以将它作为方法的参数类型?更好的是,为什么不为'{a,b,c}'创建一个类类型,然后将其作为'IEnumerable '传递给它? – Porkbutts

回答

1

您不能以强类型的方式传递匿名类型(仅作为对象)。您将不得不创建一个类型来表示匿名类型结构,对对象类型使用反射,或者使用ToList()等方法工作。

0

你可以把它作为IQueryable<dynamic>

public void SomeQueryMethod(IQueryable<dynamic> query) 
{ 
     var result = query.First(); 

     var a = result.a; //dynamic resolution 
} 
.... 
SomeQueryMethod(emp); //this should work 

但在方法上的结果对象的所有属性访问将是“动态的”,没有编译时检查。

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); 
+0

供参考:http://stackoverflow.com/questions/6624811/how-to-pass-anonymous-types-as-parameters – Shog9