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");