我目前正在使用其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();
}
答案 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");
}
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();
}
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注入。