将Linq表达式转换为SQL Server查询

3

我正在使用一些CRM框架,但该框架没有内部ORM并且不使用实体框架,仅使用纯SQL查询。

我为数据库中的每个表都有一个实体。 例如,我有:

public class Customer{
    public string FirstName{get;set;}
    public int Status{get;set;}
}  

有没有办法我可以编写Linq查询并将它们转换为SQL,而不使用Entity Framework或NHibernate?我正在寻找这样的东西。

IQueryable linq = from LinqProvider.Get<Customer>() int customer where customer.FirstName == "test" and Status > 1;

string sqlQuery = LinqProvider.ToSqlQuery(linq);

//Select * from Customer where FirstName = "test" and Status > 1

我希望能够拥有一些高级功能,如连接排序和聚合功能。


你可以使用 Linq-To-Sql。http://msdn.microsoft.com/zh-cn/library/bb386961(v=vs.110).aspx - Tim Schmelter
我只是不能,我需要手头的SQL查询。 - SexyMF
1
“你是说不用Entity Framework、nHibernate或Linq to SQL,那你需要使用Linq Provider来生成SQL语句。你是想只获取SQL而不运行EF/nH/L2S吗?” - Aron
搜索 ToTraceString - Aron
1
我不知道你刚才说的是什么。你不能单独使用Linq来创建SQL。Linq对SQL是不可知的。你是不是指你没有EF模型?如果是这样,你可以考虑使用数据库优先方式创建一个,然后放弃你的crm框架。 - Aron
显示剩余2条评论
1个回答

3
请注意以下两行代码(使用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´,但不能在dataLdataS上使用,因为它们不是查询,而是具体实例。
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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接