C# EF核心2.2中的动态Where条款

C# EF核心2.2中的动态Where条款,c#,reflection,ef-core-2.2,C#,Reflection,Ef Core 2.2,我想动态地将where子句添加到我的LINQ查询中。我有过滤器属性名称和过滤器属性值,因此我需要构建如下内容: var assignmentListQuery=context.Assignments; 如果(!string.IsNullOrWhiteSpace(bookingStep.FilterPropertyName)和&!string.IsNullOrWhiteSpace(bookingStep.FilterPropertyValue)) { assignmentListQuery=ass

我想动态地将where子句添加到我的LINQ查询中。我有过滤器属性名称和过滤器属性值,因此我需要构建如下内容:

var assignmentListQuery=context.Assignments;
如果(!string.IsNullOrWhiteSpace(bookingStep.FilterPropertyName)和&!string.IsNullOrWhiteSpace(bookingStep.FilterPropertyValue))
{
assignmentListQuery=assignmentListQuery.Where(项=>PROPERTYNAME==PROPERTYVALUE)
}
ar assignmentList=等待assignmentListQuery.ToListSync();
我已经试着获取该房产的房产信息,但在我看来,这里没有

var item=context.Set().First();
对象值=item.GetType().GetProperty(bookingStep.FilterPropertyName).GetValue(item,null);
有人知道如何创建这种where子句吗

公共类赋值
{
/// 
/// 
/// 
[显示(名称=名称(Id))]
公共int Id{get;set;}
/// 
/// 
/// 
[显示(名称=名称(订单号))]
公共字符串OrderNumber{get;set;}
/// 
/// 
/// 
[显示(名称=名称(计划加载))]
公共日期时间计划加载{get;set;}
/// 
/// 
/// 
[显示(名称=名称(CustomerOrderNumber))]
公共字符串CustomerOrderNumber{get;set;}
/// 
/// 
/// 
[显示(名称=名称(物品编号))]
公共字符串ArticleNumber{get;set;}
/// 
/// 
/// 
[显示(名称=名称(注释))]
公共字符串注释{get;set;}
[显示(名称=名称(客户ID))]
public int?CustomerId{get;set;}
[显示(名称=名称(客户))]
公共虚拟客户客户{get;set;}
}

这是分配实体,FilterPropertyName是例如“CustomerOrderNumber”

谢谢大家。我用它工作

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();
                    }
列表分配列表;
如果(!string.IsNullOrWhiteSpace(bookingStep.FilterPropertyName)&&
!string.IsNullOrWhiteSpace(bookingStep.FilterPropertyValue))
{
assignmentList=等待
assignmentListQuery.Where(e=>
EF.Property(e,bookingStep.FilterPropertyName)==
bookingStep.FilterPropertyValue).ToListSync();
}
其他的
{
assignmentList=等待assignmentListQuery.ToListSync();
}

基于@Doppelmoep-answer(它保存了我,顺便说一句),您还可以使用特殊的EF-Core-EF.Functions.Like扩展动态生成具有动态属性名称的类SQL语句和动态类SQL语句(具有通配符-%\u[^]是类SQL中的有效通配符):

assignmentList=wait
assignmentListQuery.Where(e=>
EF.Functions.Like(EF.Property(e,bookingStep.FilterPropertyName),
bookingStep.FilterPropertyValue)).ToListSync();

发布
作业的代码
,以及正在使用的
bookingStep.FilterPropertyName
的值。通常,您需要返回到使用
表达式
类上的方法构造表达式。这是关于动态LINQ的第四个问题,以及今天的位置。你们是课程的一部分吗?不管怎么说,多年前有很多重复的问题您最喜欢的搜索引擎
where
中的“c#dynamic where子句”需要一个
表达式。有许多重复的问题显示如何构造一个。大多数情况下,尽管只附加不同的
.Where()
调用基于某些条件的查询更容易,例如
if(useCustomer){query=query.Where(item=>item.Customer==value);}
出于兴趣,这会生成什么SQL语句?它是正常的,还是实际上将数据拉回到客户端并在本地执行where子句?@Neil是一种特殊的EF-Core方法,它“只能用于LINQ查询”,即读入式SQL转换,因此数据肯定不会在本地拉入。
assignmentList = await
                        assignmentListQuery.Where(e =>
                            EF.Functions.Like(EF.Property<string>(e, bookingStep.FilterPropertyName),
                             bookingStep.FilterPropertyValue)).ToListAsync();