Asp/C#.Net实体框架-基于条件创建扩展参数化查询

本文关键字:条件 创建 扩展 查询 参数 于条件 Net 实体 框架 Asp | 更新日期: 2024-05-25 15:22:37

在ADO.Net中,我创建了一个DAL文件,该文件接受用户的参数,如果这些参数不为null,则查询将基于if语句进行扩展。现在我想在实体框架中做同样的事情。我搜索了包括Stack Overflow在内的多个网站,但都没有得到满意的答案。作为参考,以下链接也不能帮助我

根据asp.net 中的列表值,选择带Where条件的查询

所需的场景是

cmd.text = "SELECT FROM tbl_name WHERE id>0 "
if(param_value != null)
{
    cmd.text += " AND (param_name = '@param_value')";
    if(!cmd.contains("param_name"))
          cmd.parameters.addwithvalue("param_name", @param_value);
    cmd.parameters["param_name"] = @param_value;
}
// proceed further with cmd.text

请现在忽略语法,我只是想传达我想做什么的概念。

我想将相同的概念应用于实体框架


两天前,我在其中发现了一个场景,查询(文本)是在aspx.cs文件中构建的,它被原样传递给DAL中的一个自定义构建函数,该函数将文本传递给cmd.text,并以ADO.net风格处理其余的检索。

这种方法具有潜在的危险性,因为任何有点知识的人都可以将这种安全性分解为理由。我想创建一个具有参数及其值的查询,就像我在上面的代码块中显示的那样。

Asp/C#.Net实体框架-基于条件创建扩展参数化查询

使用LINQ到SQL:

var param_value = 0;
db.tbl_name.Where(x => x.id > 0).Where(x => x.some_property == param_value).ToString();

如果您查看生成的SQL,您会发现它是参数化的(不过它选择了param_name)。

我在最后添加了ToString(),这样您就可以看到生成的SQL;基于OP,我想说不要这样做,继续在LINQ中直接修改查询,而不是将SQL转换为字符串并进行连接。

我刚刚发现使用Entity框架与传统方法完全不同。在这里,我们处理模型/对象及其彼此之间的关系,并基于这种关系访问它们。因此,为了回答这个问题,我们需要像一样首先获得该模型

Movie movie = db.Movies.Find(id);

除此之外,我们得到了一个模型对象,它确实具有不同的属性,如标题、IMDb、评级等。我们让他们反复使用where子句,如下所示:

db.Where(movies=>movies.IMDb==10).Where(movies=>movies.title=="The Game Plan")

这一切都等于经典方法中的以下内容

AND (IMDb = 10) AND (title = 'The Game Plan')

之后,可以随心所欲地扩展查询。再次忽略这里的语法,因为我在这里只是传达这个想法。

为了便于参考,以下链接可能有助于记住我所解释的上下文。

EF-StackOverflow 中的多个where条件