【问题标题】:How to pass parameter to Linq Orderby [duplicate]如何将参数传递给Linq Orderby [重复]
【发布时间】:2023-03-09 19:12:01
【问题描述】:

我需要将参数传递给 linq 查询。我的查询如下:

var appointments = (from a in inMemContext.Appointments
                    join u in inMemContext.Users on a.UserId equals u.UserId into AppointmentAssignments
                    from aa in AppointmentAssignments.DefaultIfEmpty()
                    join l in inMemContext.Languages on a.PreferredLanguage equals l.LanguageKey
                    where a.BranchId == branchId
                    && a.AppointmentDate.Date == TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, TimeZoneInfo.FindSystemTimeZoneById(b.TimeZoneId)).Date 
                    orderby a.AppointmentTime
                    select new AppointmentEntryDetailsDto
                    {
                        Id = a.AppointmentId.ToString(),
                        StartTime = (a.AppointmentTime).ToString("hh:mm tt", CultureInfo.InvariantCulture),
                        AppointmentType = a.AppointmentType.AppointmentTypeName,
                    });

在上述查询中,我正在获取由AppointmentTime 排序的数据。现在我需要将动态排序值设置为升序或降序。

对于这一行:

orderby a.AppointmentTime [OrderParameter]

升序或降序。我该怎么做?

【问题讨论】:

  • 如果您将 linq 查询转换为 linq 表达式,您可以更轻松地动态设置这些内容。

标签: c# linq dynamic


【解决方案1】:

没有这样的内置方式。

您可以创建自定义扩展方法(因此不使用语言集成查询),或分支整个语句,或按负时间排序(在排序前根据参数转换时间,从 24:00:00 或类似)。

【讨论】:

    【解决方案2】:

    这可以通过创建一个扩展方法来实现,该方法可以动态改变它是升序还是降序:

    public static class LinqExtensions
    {
        public static IEnumerable<TModel> OrderByDynamic<TModel, TKey>(this IEnumerable<TModel> source, Func<TModel, TKey> selector, bool ascending = true)
        {
            if (ascending) return source.OrderBy(selector);
            return source.OrderByDescending(selector);
        }
    }
    

    用法:

    var appointmentList = new List<Appointment>
    {
        new Appointment { UserId = "1", PreferredLanguage = "English", BranchId = "1", AppointmentDateTime = new DateTime(2000, 1, 1, 0, 0, 0) },
        new Appointment { UserId = "2", PreferredLanguage = "Japanese", BranchId = "1", AppointmentDateTime = new DateTime(2000, 2, 1, 0, 0, 0) },
        new Appointment { UserId = "3", PreferredLanguage = "Spanish", BranchId = "2", AppointmentDateTime = new DateTime(2000, 3, 1, 0, 0, 0) },
    };
    
    // Order By Descending
    var appointments = appointmentList.OrderByDynamic(selector: x => x.AppointmentDateTime, ascending: false);
    

    这与 Linq 查询不直接兼容,但可用于任何 IEnumerable 的结果。至于如何将其用于您的具体情况,我将由您自行决定。

    【讨论】:

    • 我怎样才能将它应用到我的代码中,这里你使用的是appointmentList。我有点困惑将其应用于我的代码
    • appointmentList 只是一个例子,因为我无权访问您的数据上下文。重要的是,如果您将代码重构为使用扩展方法而不是 Linq Query,或者在事后应用该方法,则可以应用该代码。我将留给你。
    猜你喜欢
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多