Entity Framework 使用表达式即时构建 Where 子句
Entity Framework building Where clause on the fly using Expression
使用 Entity Framework C# 并进行此查询,我需要它说的部分:
where x.Login_Status == "Submitted"
要动态。在不同的情况下,它可能是 "Submitted" 或 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>();
这可能吗?
解法:
在 if 语句中遇到更多参数时使用此
where_expression = x => x.Login_Status == "Submitted" || x.Login_Status == null;
这是对我有用的完整代码,方括号之间的任何内容都将替换为适合您的代码:
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>();
您需要 Expression<Func<Entity,bool>>
,而不是 Predicate<Entity>
。不同之处在于谓词是编译委托,表达式是作为数据的代码,因此可以转换为 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();
请注意,您需要将Entity
替换为真正的名字class。
像这样为 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");
使用 Entity Framework C# 并进行此查询,我需要它说的部分:
where x.Login_Status == "Submitted"
要动态。在不同的情况下,它可能是 "Submitted" 或 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>();
这可能吗?
解法:
在 if 语句中遇到更多参数时使用此
where_expression = x => x.Login_Status == "Submitted" || x.Login_Status == null;
这是对我有用的完整代码,方括号之间的任何内容都将替换为适合您的代码:
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>();
您需要 Expression<Func<Entity,bool>>
,而不是 Predicate<Entity>
。不同之处在于谓词是编译委托,表达式是作为数据的代码,因此可以转换为 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();
请注意,您需要将Entity
替换为真正的名字class。
像这样为 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");