C# 使用表达式动态构建实体框架Where子句
使用实体框架C#并进行此查询,我需要其中的一部分:C# 使用表达式动态构建实体框架Where子句,c#,mysql,entity-framework,visual-studio,predicate,C#,Mysql,Entity Framework,Visual Studio,Predicate,使用实体框架C#并进行此查询,我需要其中的一部分: where x.Login_Status == "Submitted" 要有活力。在不同的情况下,它可以是“submited”或null或其他形式,而不是编写包含不同查询的多个if语句,而是希望在where子句中有一个谓词 status = (from x in ctx.table where x.Login_Status == "Submitted" orderby x.SUB_DATE descen
where x.Login_Status == "Submitted"
要有活力。在不同的情况下,它可以是“submited”或null或其他形式,而不是编写包含不同查询的多个if语句,而是希望在where子句中有一个谓词
status = (from x in ctx.table
where x.Login_Status == "Submitted"
orderby x.SUB_DATE descending
select new Model_Table()
{
Id = x.ID,
Name = x.NAME,
Code = x.Code,
DateSubmitted = x.SUB_DATE
}).ToList<Model_Table>();
这是一个对我有用的完整代码,方括号之间的任何内容都可以替换为适合您的代码:
Expression<Func<[Replace with your Entity], bool>> where_submitted = x => x.Login_Status == "Submitted";
// Check if all selected
if (CheckBox_Show_All_Submitted.Checked)
{
where_submitted = x => x.Login_Status == "Submitted" || x.Login_Status == null;
}
status =
ctx.[Replace with your Entity Table]
.Where(where_submitted)
.OrderByDescending(x => x.SUB_DATE)
.Select(x => new Model_Table
{
Id = x.ID,
Name = x.NAME,
Code = x.Code,
DateSubmitted = x.SUB_DATE
}).ToList<Model_Table>();
表达式,其中_submitted=x=>x.Login_Status==“submitted”;
//检查是否选择了所有选项
如果(复选框\显示\所有\已提交。选中)
{
其中_submitted=x=>x.Login_Status==“submitted”| | x.Login_Status==null;
}
状态=
ctx。[替换为实体表]
.何处(提交地点)
.OrderByDescending(x=>x.SUB_日期)
.选择(x=>新型号表格
{
Id=x.Id,
Name=x.Name,
代码=x。代码,
提交日期=x.SUB_日期
}).ToList();
您需要的是表达式
,而不是谓词
。区别在于谓词是编译委托,表达式是作为数据的代码,因此可以转换为SQL
以下是一个例子:
//You can have this expression have different values based on your logic
Expression<Func<Entity,bool>> where_expression = x => x.Login_Status == "Submitted";
var query =
ctx.Table
.Where(where_expression)
.OrderByDescending(x => x.SUB_DATE)
.Select(x => new Model_Table())
{
Id = x.ID,
Name = x.NAME,
Code = x.Code,
DateSubmitted = x.SUB_DATE
}).ToList();
//您可以让此表达式根据您的逻辑具有不同的值
表达式,其中_Expression=x=>x.Login_Status==“已提交”;
变量查询=
ctx.表格
.Where(Where_表达式)
.OrderByDescending(x=>x.SUB_日期)
.Select(x=>newmodel_Table())
{
Id=x.Id,
Name=x.Name,
代码=x。代码,
提交日期=x.SUB_日期
}).ToList();
请注意,您需要将
实体
替换为实际类的名称。为IQueryable创建一个扩展方法,如下所示:
public static class MethodExtensions{
public static IEnumerable<Model_Table> Query(this IQueryable<TEntity> source, string data){
return (from x in source
where x.Login_Status == data
orderby x.SUB_DATE descending
select new Model_Table()
{
Id = x.ID,
Name = x.NAME,
Code = x.Code,
DateSubmitted = x.SUB_DATE
}).ToList<Model_Table>();
}
}
var result = ctx.table.Query("somethingelse");
您可以使用一个位枚举,然后使用(这实际上不考虑空的情况)。请参阅我在一个类似问题中的回答:您需要一个表达式,而不是谓词。OP使用的是实体框架,所以
ctx。table
的类型是IQueryable
。如果使用ef,则表是DbSet,它实现了IEnumerable,IQueryable…对。但是如果使用IEnumerable
,则所有表内容都将被查询并存储在内存中,并且Where
和OrderBy
将在内存中执行。我的意思是,您的扩展方法应该接受IQueryable
,这样查询将发生在数据库端,而不是内存中。这真的很有帮助。有一个小问题。使用此表达式时,其中_expression=x=>x.Login_Status==“已提交”;它只适用于值“Submitted”,但我需要同时具有“Submitted”和null。表达式中可以有任何条件。例如,您可以使用x=>x.Login_Status==“Submitted”| x.Login_Status==null
。
var result = ctx.table.Query("somethingelse");