C# 直接通过LINQ将查询传递给数据库
我目前正在使用旧应用程序的DAL中的Entity Framework/LINQ将其DAL中的函数转换为新应用程序 在某些情况下,我希望直接向数据库传递一个sql字符串。这在使用LINQ时可能吗?这是我在费尔研究所做的尝试,但ExecuteQuery不可用C# 直接通过LINQ将查询传递给数据库,c#,linq,entity-framework,entity-framework-6,C#,Linq,Entity Framework,Entity Framework 6,我目前正在使用旧应用程序的DAL中的Entity Framework/LINQ将其DAL中的函数转换为新应用程序 在某些情况下,我希望直接向数据库传递一个sql字符串。这在使用LINQ时可能吗?这是我在费尔研究所做的尝试,但ExecuteQuery不可用 using (var context = new DbContext()) { var sql = @"SELECT DISTINCT * FROM Customer where CustomerId = {0}";
using (var context = new DbContext())
{
var sql = @"SELECT DISTINCT * FROM Customer where CustomerId = {0}";
sql = string.Format(sql, customerId);
var query = DbContext.ExecuteQuery<Customer>(sql);
return query.ToList();
}
如果没有限制或要求不使用此类查询,那么它们很容易受到sql注入攻击 您可以使用linq使用实体框架完成几乎每个句子,就像您编写的句子一样
DbContext.Customer.Where(c => c.CustomerId = id).Distinct();
它更可读,更安全。如果没有限制或要求,不要使用此类查询,它们容易受到sql注入攻击 您可以使用linq使用实体框架完成几乎每个句子,就像您编写的句子一样
DbContext.Customer.Where(c => c.CustomerId = id).Distinct();
它更具可读性,也更安全。尽管对于您当前的情况,您可以使用LINQ
var customer = context.Customers.Where(c => c.CustomerId = id).Distinct();
你就是这样做的
向数据库发送原始命令
为实体编写SQL查询
从存储过程加载实体
为非实体类型编写SQL查询
如果你真正的疑问是
sql.AppendLine("SELECT * FROM CUSTOMERS ");
sql.AppendLine("WHERE @CustomerId = null OR CustomerId = @CustomerId ");
sql.AppendLine("AND @CustomerName = null OR CustomerName = @CustomerName ");
我建议你这样做
var customers = context.Costomers; // this does not populates the result yet
if (!String.IsNullOrEmpty(customerId))
{
customers = customers.Where(c => c.CustomerId = customerId); // this does not populates the result yet
}
if (!String.IsNullOrEmpty(customerName))
{
customers = customers.Where(c => c.CustomerName = customerName); // this does not populates the result yet
}
// finally execute the query
var custList = customers.ToList();
虽然对于您当前的情况,您可以使用LINQ
var customer = context.Customers.Where(c => c.CustomerId = id).Distinct();
你就是这样做的
向数据库发送原始命令
为实体编写SQL查询
从存储过程加载实体
为非实体类型编写SQL查询
如果你真正的疑问是
sql.AppendLine("SELECT * FROM CUSTOMERS ");
sql.AppendLine("WHERE @CustomerId = null OR CustomerId = @CustomerId ");
sql.AppendLine("AND @CustomerName = null OR CustomerName = @CustomerName ");
我建议你这样做
var customers = context.Costomers; // this does not populates the result yet
if (!String.IsNullOrEmpty(customerId))
{
customers = customers.Where(c => c.CustomerId = customerId); // this does not populates the result yet
}
if (!String.IsNullOrEmpty(customerName))
{
customers = customers.Where(c => c.CustomerName = customerName); // this does not populates the result yet
}
// finally execute the query
var custList = customers.ToList();
您可以使用,但最好传递参数,而不是使用格式
:
var sql = @"SELECT DISTINCT * FROM Customer where CustomerId = {0}";
var query = DbContext.SqlSuery<Customer>(sql, customerId);
var sql=@“从CustomerId={0}的客户中选择不同的*”;
var query=DbContext.SqlSuery(sql,customerId);
这样,参数是SQL编码的,因此不允许SQL注入。您可以使用,但最好传递参数,而不是使用格式
:
var sql = @"SELECT DISTINCT * FROM Customer where CustomerId = {0}";
var query = DbContext.SqlSuery<Customer>(sql, customerId);
var sql=@“从CustomerId={0}的客户中选择不同的*”;
var query=DbContext.SqlSuery(sql,customerId);
通过这种方式,参数是SQL编码的,因此不允许SQL注入。Phenominal answer。我不知道过去两个小时我怎么在任何文档中都没有找到类似的内容。@JTunney-我记得我第一次遇到同样的挫折,然后我的一个同事分享了这个链接,从那时起,我就一直在我的书签中。你知道不使用string.format将参数传递给其中一个查询的好方法吗?我在我的帖子中添加了我是如何做到这一点的。您知道更好的方法吗?@JTunney阅读方法说明一次
您提供的任何参数值都将自动转换为DbParameter。
最终答案。我不知道过去两个小时我怎么在任何文档中都没有找到类似的内容。@JTunney-我记得我第一次遇到同样的挫折,然后我的一个同事分享了这个链接,从那时起,我就一直在我的书签中。你知道不使用string.format将参数传递给其中一个查询的好方法吗?我在我的帖子中添加了我是如何做到这一点的。您知道更好的方法吗?@JTunney阅读方法说明一次您提供的任何参数值都将自动转换为DbParameter。
我喜欢这个答案。我认为问题的解决方法应该认真考虑这一方法。如果他们正在转换为EF,那么真正利用EF提供的功能(而不是在新的ORM中执行旧的DAL实践)是有意义的。我知道这一点,我的应用程序中的几乎所有内容都是在linq中完成的。我只是在这里举了一个简单的例子,而不是我实际上试图避免使用linq编写的大型查询。如果时间紧迫,并且有些DAL查询需要转换1000行,你会不会也这样做?@JTunney这取决于,我会尽我所能使用liqn。如果我是你,在这匆忙之后。我会将原始sql移到Linq,因为它是一个弱代码。如果任何开发人员更改了POCO的任何属性,很容易忘记原始Sql会受到影响,编译器在这种情况下不会向您提供建议。我是对的。我的计划是,一旦一切都可以运行,就返回过去,让几乎所有的东西都使用LINQ或至少是存储过程。事实上,我用这个过去的函数结束了存储过程,因为使用string.format查找我拥有的8个参数非常糟糕。我喜欢这个答案。我认为问题的解决方法应该认真考虑这一方法。如果他们正在转换为EF,那么真正利用EF提供的功能(而不是在新的ORM中执行旧的DAL实践)是有意义的。我知道这一点,我的应用程序中的几乎所有内容都是在linq中完成的。我只是在这里举了一个简单的例子,而不是我实际上试图避免使用linq编写的大型查询。如果时间紧迫,并且有些DAL查询需要转换1000行,你会不会也这样做?@JTunney这取决于,我会尽我所能使用liqn。如果我是你,在这匆忙之后。我会将原始sql移到Linq,因为它是一个弱代码。如果任何开发人员更改了POCO的任何属性,很容易忘记原始Sql会受到影响,编译器在这种情况下不会向您提供建议。我是对的。我的计划是,一旦一切都可以运行,就返回过去,让几乎所有的东西都使用LINQ或至少是存储过程。实际上,我最终使用了这个过去的函数执行存储过程,因为使用string.format查找我拥有的8个参数非常糟糕。
var sql = @"SELECT DISTINCT * FROM Customer where CustomerId = {0}";
var query = DbContext.SqlSuery<Customer>(sql, customerId);