Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用表达式动态构建实体框架Where子句_C#_Mysql_Entity Framework_Visual Studio_Predicate - Fatal编程技术网

C# 使用表达式动态构建实体框架Where子句

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

使用实体框架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 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");