请注意以下两行之间的差异(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查询被转换为lamba,然后进行了优化和自动编译(来自框架4.5)。默认情况下,数据库上下文应启用延迟加载和开放式并发。延迟加载意味着在实际需要之前不会获取数据。在这种情况下
.ToList(),
SingleOrDefault将强制重试数据。这意味着它们将显示在Entity
framework Profiler中。
如果您不想使用它,或者可以不使用它,则可以使用ToToTraceString麓,但是它不能继续工作,
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; } } //PM> Install-Package Entityframework //PM> Install-Package Entityframework.SqlServerCompact 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)



