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

时间:2013-12-27 23:31:15

标签: c# string lambda string-concatenation

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

myProjects = dataAccessHelper.GetMyDetails(id).
  Where(Append qry string here).ToList();

我正在尝试将查询字符串输出附加到Lambda表达式中的位置。如果我采取

,它工作正常
myProjects = dataAccessHelper.GetMyDetails(id).
  Where(p => p.Title == "Test" && P.Status=0).ToList(); 

但不喜欢这个

myProjects = dataAccessHelper.GetMyDetails(id).
  Where("+ qry +").ToList();

如何连接它并使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);

        }

2 个答案:

答案 0 :(得分:4)

您正在寻找的是功能表达。您将需要Where子句的类型,我将假设您的类型是Project。

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

//assuming Project is type
Expression<Func<Project, bool>> expr = p => p.Title == "Test" && p.Status == 0;

如果您正在使用linq到对象,那么您可以省略表达式

//assuming Project is type
Func<Project, bool> expr = p => p.Title == "Test" && p.Status == 0;

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

myProjects = dataAccessHelper.GetMyDetails(id).Where(expr).ToList();

修改

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

public virtual ActionResult MyProjects(int? id, string title = "Title", int status = 0)

然后

Func<Project, bool> expr = p => p.Title == title && p.Status == status;

答案 1 :(得分:1)

要将字符串转换为表达式,您需要进行某种形式的动态编译。此博客文章包含一些执行此操作的选项:

http://jp-labs.blogspot.com/2008/11/dynamic-lambda-expressions-using.html