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

将linq选择查询传递给方法

可以用一种不关心它是否是匿名类型的方式来做到这一点——如果你传递一个方法来挑选相关的属性,你甚至可以对它做一些工作。

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

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