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);
}
答案 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