【问题标题】:Dynamic Where Clause in EF Core 2.2EF Core 2.2 中的动态 Where 子句
【发布时间】:2019-11-22 06:15:40
【问题描述】:

我想在我的 LINQ 查询中动态添加 where 子句。我有过滤器属性名称和过滤器属性值,所以我需要构建这样的东西:

var assignmentListQuery = context.Assignments;

if (!string.IsNullOrWhiteSpace(bookingStep.FilterPropertyName) && !string.IsNullOrWhiteSpace(bookingStep.FilterPropertyValue))
{
    assignmentListQuery = assignmentListQuery.Where(item => PROPERTYNAME == PROPERTYVALUE)
}

ar assignmentList = await assignmentListQuery.ToListAsync();

我试图获取该属性的属性信息,这对我来说似乎不是。

var item = context.Set<Assignment>().First();
object value = item.GetType().GetProperty(bookingStep.FilterPropertyName).GetValue(item, null);

有人知道如何创建这种 where 子句吗?

public class Assignment
    {
        /// <summary>
        /// 
        /// </summary>
        [Display(Name = nameof(Id))]
        public int Id { get; set; }

        /// <summary>
        /// 
        /// </summary>
        [Display(Name = nameof(OrderNumber))]
        public string OrderNumber { get; set; }

        /// <summary>
        /// 
        /// </summary>
        [Display(Name = nameof(ScheduledLoading))]
        public DateTime ScheduledLoading { get; set; }

        /// <summary>
        /// 
        /// </summary>
        [Display(Name = nameof(CustomerOrderNumber))]
        public string CustomerOrderNumber { get; set; }

        /// <summary>
        /// 
        /// </summary>
        [Display(Name = nameof(ArticleNumber))]
        public string ArticleNumber { get; set; }

        /// <summary>
        /// 
        /// </summary>
        [Display(Name = nameof(Comment))]
        public string Comment { get; set; }

        [Display(Name = nameof(CustomerId))]
        public int? CustomerId { get; set; }
        [Display(Name = nameof(Customer))]
        public virtual Customer Customer { get; set; }
}

这是分配实体,FilterPropertyName 是例如"客户订单号"

【问题讨论】:

  • 贴出Assignment的代码,以及你正在使用的bookingStep.FilterPropertyName的值。
  • 一般来说,您需要退回到使用Expression 类上的方法构造表达式。
  • 这是关于动态 LINQ 和今天在哪里的第四个问题。你们是课程的一部分还是什么?无论如何,有很多重复的问题,可以追溯到几年前。
  • docs.microsoft.com/en-us/dotnet/csharp/programming-guide/… + "c# 动态 where 子句" 在你最喜欢的搜索引擎中
  • Where 需要 Expression&lt;Func&lt;TEntity,bool&gt;&gt;。有许多重复的问题展示了如何构建一个。大多数时候,尽管根据某些条件将不同的.Where() 调用附加到查询中会更容易,例如if (useCustomer) {query=query.Where(item=&gt;item.Customer == value);}

标签: c# reflection ef-core-2.2


【解决方案1】:

谢谢大家。我让它工作了

List<Assignment> assignmentList;
                    if (!string.IsNullOrWhiteSpace(bookingStep.FilterPropertyName) &&
                        !string.IsNullOrWhiteSpace(bookingStep.FilterPropertyValue))
                    {
                        assignmentList = await
                            assignmentListQuery.Where(e =>
                                EF.Property<string>(e, bookingStep.FilterPropertyName) ==
                                bookingStep.FilterPropertyValue).ToListAsync();
                    }
                    else
                    {
                        assignmentList = await assignmentListQuery.ToListAsync();
                    }

【讨论】:

  • 出于兴趣,这生成的 SQL 语句是什么?它是理智的,还是它实际上将数据拉回客户端并在本地执行 where 子句?
  • @Neil EF.Property是一种特殊的EF Core方法,“只能在LINQ查询中使用”,读入SQL翻译,所以绝对不会在本地拉取数据.
【解决方案2】:

基于@Doppelmoep 答案(这救了我,顺便说一句),您还可以使用特殊的 EF Core EF.Functions.Like 扩展来动态生成具有动态 PROPERTYNAME 和动态 SQL Like 语句的 SQL Like 语句(使用通配符 - %_ [^] 是类似 SQL 中的有效通配符):

assignmentList = await
                        assignmentListQuery.Where(e =>
                            EF.Functions.Like(EF.Property<string>(e, bookingStep.FilterPropertyName),
                             bookingStep.FilterPropertyValue)).ToListAsync();

【讨论】:

    猜你喜欢
    • 2021-06-15
    • 2022-06-22
    • 1970-01-01
    • 2019-05-21
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多