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风格处理其余的检索。
这种方法具有潜在的危险性,因为任何有点知识的人都可以将这种安全性分解为理由。我想创建一个具有参数及其值的查询,就像我在上面的代码块中显示的那样。
使用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条件