Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 直接通过LINQ将查询传递给数据库_C#_Linq_Entity Framework_Entity Framework 6 - Fatal编程技术网

C# 直接通过LINQ将查询传递给数据库

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}";

我目前正在使用旧应用程序的DAL中的Entity Framework/LINQ将其DAL中的函数转换为新应用程序

在某些情况下,我希望直接向数据库传递一个sql字符串。这在使用LINQ时可能吗?这是我在费尔研究所做的尝试,但ExecuteQuery不可用

    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);