【问题标题】:Converting Linq expression to sql server query将 Linq 表达式转换为 sql server 查询
【发布时间】:2014-08-13 10:13:03
【问题描述】:

我正在使用一些crm框架,这个框架没有任何内部orm,也没有使用实体框架,只有普通的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

我希望拥有一些高级功能,例如加入排序和聚合功能。

【问题讨论】:

  • 我就是做不到,我手里需要sql查询。
  • -1 没有 Entity Framework 或 nHibernate 或 Linq to SQL 是什么意思?您需要使用 Linq Provider 来生成 SQL!你的意思是你只想获取 SQL 而不是 EF/nH/L2S RUN SQL?
  • @Aron - 我的意思是查询必须在实体框架之外执行。
  • 我不知道你刚才说了什么。您不能单独使用 Linq 来创建 SQL。 Linq 与 SQL 无关。你的意思是你没有EF模型?如果是这样,您可以考虑先使用数据库创建一个,然后删除您的 crm 框架。

标签: c# sql linq


【解决方案1】:

注意以下两行之间的区别(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

如果您不想使用或不能使用它,那么您可以使用“ToTraceString”,但它不适用于dataLdataS,因为它们不是查询,而是具体实例。

File.AppendAllText(traceFile, ((ObjectQuery)dataQ).ToTraceString());   
return dataQ.ToList();

编辑

我所做的假设:

  • 我的假设是您不会编写正确的 SQL,但对 Linq 有点熟悉。
  • 您有不常见的数据库,该数据库将使用第三方提供商,或者您甚至不能这样做。
  • 您(手动?)为数据库表创建了映射

现在你可以做的是使用code first方法。您从这些类生成数据库。然后查询它并获得 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多