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

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

最佳答案

请注意以下 2 行(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 有点熟悉。
  • 你有使用 3rd 方提供程序的不常见数据库,或者你甚至不能这样做。
  • 您(手动?)为数据库表创建了映射

  • 现在你可以做的是使用 代码优先 方法。您从这些类生成数据库。然后你查询它,你会得到你的 SQL 。我认为这很清楚。请注意,您可能还希望获得代码优先迁移,因为您很可能需要进行更改。

    例子(只是谷歌):
  • http://msdn.microsoft.com/en-us/data/jj193542.aspx
  • http://msdn.microsoft.com/en-us/data/jj591621.aspx

  • 编辑 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)
    

    关于c# - 将 Linq 表达式转换为 sql server 查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25283515/

    10-16 15:25
    查看更多