将linq select查询传递给方法

时间:2013-05-29 20:57:19

标签: c# .net linq entity-framework

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()。 谢谢!

3 个答案:

答案 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

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