将查询直接通过LINQ传递给db

时间:2015-06-08 18:45:44

标签: c# linq entity-framework entity-framework-6

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

在某些情况下,我想直接将一串sql传递给数据库。使用LINQ时这可能吗?这是我尝试研究但是ExecuteQuery不可用。

select case when count(*) > 0 then cat else NULL end as MyCat_Column
from (
select Cat
from table1
where color in ('maroon','orange')
group by cat
having count(distinct color) >= 2
) tab;

这样做看起来非常简单,但我无法使用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();
    }

3 个答案:

答案 0 :(得分:2)

如果没有限制或要求不使用此类查询,则很容易受到sql注入攻击。

您可以使用linq执行几乎所有使用实体框架的句子,就像您编写的那样

DbContext.Customer.Where(c => c.CustomerId = id).Distinct();

它更具可读性,更安全。

答案 1 :(得分:2)

虽然您目前的情况可以使用LINQ。

var customer = context.Customers.Where(c => c.CustomerId = id).Distinct();

你就是这样做的Entity Framework Raw SQL Queries

将原始命令发送到数据库

using (var context = new DbContext()) 
{ 
    context.Database.SqlCommand( 
        "UPDATE dbo.Blogs SET Name = 'Another Name' WHERE BlogId = 1"); 
}

为实体编写SQL查询

using (var context = new DbContext()) 
{ 
    var customers = context.Customers.SqlQuery("SELECT * FROM dbo.Customers").ToList(); 
}

从存储过程中加载实体

using (var context = new DbContext()) 
{ 
    var customers = context.Blogs.SqlQuery("dbo.GE_Customers").ToList(); 
}

为非实体类型编写SQL查询

using (var context = new DbContext()) 
{ 
    var customerNames = context.Database.SqlQuery<string>( 
                       "SELECT Name FROM dbo.Customers").ToList(); 
}

更新回答

您无需传递SqlParameter,只需传递默认对象

即可

我认为下面的代码应该可以正常工作。

var customerList = context.Customers.SqlQuery(sql.ToString(), customerId, customerName).ToList(); 

如果您的真实查询是

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

答案 2 :(得分:1)

您可以使用SqlQuery,但最好传递参数而不是使用Format

  var sql = @"SELECT DISTINCT * FROM Customer where CustomerId = {0}";
  var query = DbContext.SqlSuery<Customer>(sql, customerId);

这样,参数是SQL编码的,以便不允许SQL注入。