请注意以下两行代码(使用lambda表达式的linq)之间的区别:
var dataQ = Customer.Where(o=>(o.FirstName == "test" && o.Status > 1);
var dataL = Customer.Where(o=>(o.FirstName == "test" && o.Status > 1).ToList();
var dataS = Customer.SingleOrDefault(o=>(o.FirstName == "test" && o.Status > 1);
据我所知,linq查询会被转换为lambda表达式,然后进行优化和自动编译(从框架4.5开始)。默认情况下,您的数据库上下文应该具有延迟加载和乐观并发。延迟加载意味着在实际需要数据之前不会获取数据。在这种情况下,
.ToList()
和
SingleOrDefault
将强制检索数据。这意味着它们将显示在
Entity Framework Profiler中。
如果您不想使用它或无法使用它,则可以使用´ToTraceString´,但不能在
dataL
或
dataS
上使用,因为它们不是查询,而是具体实例。
File.AppendAllText(traceFile, ((ObjectQuery)dataQ).ToTraceString())
return dataQ.ToList()
编辑
我做出的假设:
- 我的假设是您不能编写正确的SQL,但对Linq有一定的了解。
- 您使用的是不常见的数据库,需要使用第三方提供程序,或者甚至无法这样做。
- 您(手动?)创建了数据库表的映射。
现在您可以使用代码优先方法。您可以从这些类中生成数据库。然后查询它,就可以得到您的SQL。我假设这很清楚。请注意,您可能还需要获取代码优先迁移,因为您很可能需要进行更改。
示例(只需谷歌):
编辑2
举个例子:
https://gist.github.com/margusmartsepp/f9fcc9178600ca53acf6
[Table("CustomerTest")]
public class Customer
{
[Key]
public int Id { get; set; }
public string FirstName { get; set; }
public int Status { get; set; }
}
public class CustomerContext : DbContext
{
public CustomerContext(): base("name=Program.CustomerContext"){}
public DbSet<Customer> Customers { get; set; }
}
static void Main(string[] args)
{
using (var db = new CustomerContext())
{
var item = new Customer {FirstName = "test", Status = 2};
db.Customers.Add(item);
db.SaveChanges();
var items = db.Customers.Where(o => (o.FirstName == "test" && o.Status > 1));
Console.WriteLine(items.ToString());
}
Console.ReadKey();
}
示例输出:
SELECT
[Extent1].[Id] AS [Id],
[Extent1].[FirstName] AS [FirstName],
[Extent1].[Status] AS [Status]
FROM [CustomerTest] AS [Extent1]
WHERE (N'test' = [Extent1].[FirstName]) AND ([Extent1].[Status] > 1)