将Linq表达式转换为sql server查询

本文关键字:sql server 查询 转换 Linq 表达式 | 更新日期: 2023-09-27 18:17:43

我正在使用一些crm框架,这个框架没有任何内部表单,也没有使用实体框架,只有普通的sql查询。

我有实体在数据库中的每个表。例如:

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

无论如何我可以写linq查询和转换成sql 不使用实体框架或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表达式转换为sql server查询

注意以下两行之间的区别(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将强制重试数据。这意味着它们将显示在实体框架分析器中。

如果你不想使用它或不能,那么你可以使用' ToTraceString ',但它不会在dataLdataS上工作,因为它们不是查询,而是具体的实例。

File.AppendAllText(traceFile, ((ObjectQuery)dataQ).ToTraceString());   
return dataQ.ToList();
<标题>编辑

我所做的假设:

  • 我的假设是你不会写正确的SQL,但对Linq有点熟悉。
  • 你有不常见的数据库,会使用第三方提供商,或者你甚至不能这样做。
  • 您(手动?)为数据库表创建了映射
现在你可以做的是使用代码优先方法。从这些类生成数据库。然后您查询它并得到SQL。我想这已经很清楚了。请注意,您可能也希望获得代码优先迁移,因为您很可能需要进行更改。

示例(仅google):

  • http://msdn.microsoft.com/en-us/data/jj193542.aspx
  • http://msdn.microsoft.com/en-us/data/jj591621.aspx
<标题>编辑2 h1> 个例子: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)