簡體   English   中英

將Linq表達式轉換為sql server查詢

[英]Converting Linq expression to sql server query

我使用的是一些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

我希望擁有一些高級功能,如加入排序和聚合功能。

注意以下兩行之間的差異(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有些熟悉。
  • 您有使用第三方提供商的不常見數據庫,或者您甚至無法做到這一點。
  • 您(手動?)為數據庫表創建了映射

現在你可以做的是使用代碼優先方法。 您從這些類生成數據庫。 然后你查詢它,你得到你的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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM