【问题标题】:How Can I Building The Lambda Expressions Dynamically With String如何使用字符串动态构建 Lambda 表达式
【发布时间】:2020-04-22 11:00:00
【问题描述】:

这是我的代码。

[HttpPost]
public ActionResult TopProjects(FormCollection form)
{
  bool top, desgin, implement;
  string str = "";
  if (string.IsNullOrEmpty(form["top"])) { top = false; } else { top = true;str += "x=>x.IsTopProject==top"; }
  if (string.IsNullOrEmpty(form["desgin"])) { desgin = false; } else { desgin = true; str += "&& x.IsAnDesigning==desgin"; }
  if (string.IsNullOrEmpty(form["implement"])) { implement = false; } else { implement = true;str += "&& x.IsAnImplementation==implement"; }

   return View(blProject.Select().Where(str));
 }

lambda 从 str 获取错误。 怎么解决?

【问题讨论】:

  • 方法不将字符串作为参数。需要提供Func谓词见docs.microsoft.com/en-us/dotnet/api/…请问为什么需要字符串?
  • (顶部、设计、实现)是树复选框。我尝试通过检查其中任何一个来过滤表格。所以我需要动态 lambda。

标签: c# asp.net-mvc linq asp.net-core lambda


【解决方案1】:

显然blProject一个类的对象实现了某个类的IQueryable,假设它实现了IQueryable<BlProjectItem>:

IQueryable<BlProjectItem> blProjects = ...

显然每个 BlProjectItem 至少有三个布尔属性:

class BlProjectItem
{
    public bool IsTopProject {get; set;}
    public bool IsAnDesigning {get; set;}
    public bool IsAnImplementation {get; set;}

    ...
}

您以一种困难的方式定义了三个布尔值,您的意思是:

bool top =       String.IsNullOrEmpty(form["top"]));
bool design =    String.IsNullOrEmpty(form["desgin"]);
bool implement = String.IsNullOrEmpty(form["implement"]);

取决于顶部/设计/实现的值是否是您想要的

 Top   Design   Implement     All BlProjectItems where
  0      0         0          !IsTopProject && !IsAnDesigning && !IsAnImplementation
  0      0         1          !IsTopProject && !IsAnDesigning &&  IsAnImplementation
  0      1         0          !IsTopProject &&  IsAnDesigning && !IsAnImplementation
  0      1         1          !IsTopProject &&  IsAnDesigning &&  IsAnImplementation

  1      0         0           IsTopProject && !IsAnDesigning && !IsAnImplementation
  1      0         1           IsTopProject && !IsAnDesigning &&  IsAnImplementation
  1      1         0           IsTopProject &&  IsAnDesigning && !IsAnImplementation
  0      1         1           IsTopProject &&  IsAnDesigning &&  IsAnImplementation

换句话说,你想要:

 .Where(item => item.IsTopProject == top
             && item.IsAnDesigning == design
             && item.IsAnImplementation == implement)

你的函数会是这样的:

public ActionResult TopProjects(FormCollection form)
{
    bool top =       String.IsNullOrEmpty(form["top"]));
    bool design =    String.IsNullOrEmpty(form["desgin"]);
    bool implement = String.IsNullOrEmpty(form["implement"]);

    var query = blProject.Where(item => item.IsTopProject == top
             && item.IsAnDesigning == design
             && item.IsAnImplementation == implement)

    // only if you don't want all properties of BlProjectItem:
    .Select(item => new
    {
         // Select the items that you want, e.g.
         Id = item.Id,
         Name = item.Name,
         ...
    });

    return view(Query);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多