繁体   English   中英

将OrderBy lambda函数作为参数传递

[英]Pass OrderBy lambda function as a parameter

假设我有一个具有两个属性NameAge的模型名称User 我想知道接受User并返回这些属性之一的lambda函数的类型,以便可以在OrderBy方法中使用lambda函数。

using System;
using System.Linq;

public class User {
    public string Name { get; set; }
    public int Age { get; set; }
}

public class MainClass {
    static void Main() {

        var users = new User[] {
            new User { Name = "David", Age = 16 },
            new User { Name = "Charlie", Age = 29 },
            new User { Name = "Alice", Age = 15 },
            new User { Name = "Deanna", Age = 27 },
        }.AsQueryable();

        Write(GetAdultsBy(users, u => u.Name));
        Write(GetAdultsBy(users, u => u.Age));
    }

    private static IQueryable<User> GetAdultsBy(IQueryable<User> users, Func<User, object> order) {
        return users
            .Where(u => u.Age > 18)
            .OrderBy(order); // FAIL in ORDER BY
    }

    private static void Write(IQueryable<User> query) {
        var names = query.Select(u => u.Name);
        Console.WriteLine(string.Join(", ", names));
    }
}

运行此代码时出现以下错误:

/tmp/997240133/main.cs(26,14):错误CS0266:无法将类型System.Linq.IOrderedEnumerable<User>' to隐式转换System.Linq.IOrderedEnumerable<User>' to System.Linq.IQueryable'。 存在显式转换(您是否缺少演员表?)

但是显式排序可以与Write(users.OrderBy(u => u.Age)); 正如人们所期望的那样。

那么Func<User, object> order参数的类型应该是什么?

您需要将private static IQueryable<User> GetAdultsBy()定义为通用函数,以匹配如何定义OrderBy <>。 特别:

private static IOrderedQueryable<User> GetAdultsBy<T>(
    IQueryable<User> source,
    Expression<Func<User, T>> order)

要使用IQueryable ,您需要传递表达式树( Expression<Func<...>> )。

表达式树在运行时对la​​mbda的内容进行编码,从而可以将其转换为SQL。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM