Lambda表达式中的C#字符串连接

Kur*_*ula 5 c# string lambda string-concatenation

String qry = "p => p.Title == "Test" && P.Status=0;

myProjects = dataAccessHelper.GetMyDetails(id).
  Where(Append qry string here).ToList();
Run Code Online (Sandbox Code Playgroud)

我试图将我的查询字符串输出附加到Lambda表达式中的位置.如果我拿它,它工作正常

myProjects = dataAccessHelper.GetMyDetails(id).
  Where(p => p.Title == "Test" && P.Status=0).ToList(); 
Run Code Online (Sandbox Code Playgroud)

但不是这样的

myProjects = dataAccessHelper.GetMyDetails(id).
  Where("+ qry +").ToList();
Run Code Online (Sandbox Code Playgroud)

我如何连接这个并使lambda表达式起作用.

我的控制器代码

   [HttpGet]
        public virtual ActionResult MyProjects(int? id, string qry)
        {
            var dataAccessHelper = new DataAccessHelper(true);
            IList<ProjectEntity> myProjects;
            if (qry == null)
            {
                myProjects = dataAccessHelper.GetMyProjects(id);
            }
            else
            {
                Expression<Func<ProjectEntity, bool>> expr = qry;
                myProjects = dataAccessHelper.GetMyProjects(id).Where(expr).ToList();

            }

            var myProjectsViewModel = new MyProjectsViewModel() { GetMyProjects =                  myProjects };
            return View(myProjectsViewModel);

        }
Run Code Online (Sandbox Code Playgroud)

Tra*_*s J 4

您正在寻找的是函数表达式。您将需要该子句的类型Where,我假设您的类型是项目。

如果您使用 linq to sql,则需要构造一个表达式

//assuming Project is type
Expression<Func<Project, bool>> expr = p => p.Title == "Test" && p.Status == 0;
Run Code Online (Sandbox Code Playgroud)

如果您使用 linq to 对象,则可以省略表达式

//assuming Project is type
Func<Project, bool> expr = p => p.Title == "Test" && p.Status == 0;
Run Code Online (Sandbox Code Playgroud)

现在您可以在 where 子句中使用它

myProjects = dataAccessHelper.GetMyDetails(id).Where(expr).ToList();
Run Code Online (Sandbox Code Playgroud)

编辑

关于您的编辑。您实际上无法传递字符串来执行此操作。最好的选择是传入“测试”和状态整数,然后将它们放入表达式中。

public virtual ActionResult MyProjects(int? id, string title = "Title", int status = 0)
Run Code Online (Sandbox Code Playgroud)

进而

Func<Project, bool> expr = p => p.Title == title && p.Status == status;
Run Code Online (Sandbox Code Playgroud)

  • @Usham - 是的,“表达式”将需要包含命名空间。`使用 System.Linq.Expressions;` (2认同)