2011-05-17 42 views
2

下面兩段代碼有什麼區別?c#linq to sql - 在linq break結尾處移動FirstOrDefault()查詢

這將返回我預計數據....

return productTable.FirstOrDefault(p => p.ProductId == productId); 

這不....

return productTable.Where(x => x.ProductId == productId).FirstOrDefault(); 

我主要只是想知道如果有這兩個之間的邏輯區別。

+1

當你說它不起作用時,你是什麼意思? – Gabe 2011-05-17 03:12:19

+2

第二個數據返回的數據是什麼?我的猜測是產品ID在沿線的某處不同...... – krs1 2011-05-17 03:13:21

+0

在第一個查詢中返回單個「產品」類。第二個查詢在傳遞相同的ID時不會返回任何內容。 – contactmatt 2011-05-17 03:14:50

回答

4

這些查詢應該基本相同。 FirstOrDefault()的無參數版本只抓取查詢中可用的第一條記錄,如果沒有可用記錄,則取缺省值(即null)。

編輯2正如在評論中指出的,我應該使用LINQ到SQL。下面是與LINQ到SQL的樣品:

using (ProductsDataContext context = new ProductsDataContext()) 
{ 
    context.Log = Console.Out; 
    var p1 = context.Products.FirstOrDefault(p => p.ProductId == 1); 
    var p2 = context.Products.Where(p => p.ProductId == 1).FirstOrDefault(); 
} 

輸出(注意查詢是完全相同):

SELECT TOP(1)[T 0] [產品編號], [T0 ] [Name] FROM [dbo]。[Products] AS [t0] WHERE [t0]。[ProductId] = @ p0 - @ p0:Input Int(Size = -1; Prec = 0; Scale = 0 )[1] - 上下文:SqlProvider(Sql2008)型號:AttributedMetaModel構建: 4.0.30319.1

SEL ECT TOP(1)[t0]。[ProductId], [t0]。[Name] FROM [dbo]。[Products] AS [t0] WHERE [t0]。[ProductId] = @ p0 - @ p0 :輸入Int(大小= -1; Prec = 0;規模= 0)[1] - 上下文:sqlProvider的(SQL2008)型號:AttributedMetaModel體形: 4.0.30319.1

編輯:這裏是示例代碼來演示他們是同一件事:

class Product 
{ 
    public int ProductId { get; set; } 
    public string Name { get; set; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<Product> productTable = new List<Product> { 
      new Product { ProductId = 123, Name = "Cheese" }, 
      new Product { ProductId = 456, Name = "Milk" }, 
     }; 

     var r1 = productTable.FirstOrDefault(p => p.ProductId == 123); 
     var r2 = productTable.Where(p => p.ProductId == 123).FirstOrDefault(); 

     // these print out the same thing 
     Console.WriteLine(r1.Name); 
     Console.WriteLine(r2.Name); 

     Console.ReadLine(); 
    } 
} 
+0

我用這與Linq 2 Sql,我認爲問題在那裏。你是對的,我嘗試了一個單獨的測試,他們返回相同的數據。必須是我的DataContext或某種類型的東西... – contactmatt 2011-05-17 03:17:23

+0

「productTable」的實例是已經應用了一些LINQ-to-SQL邏輯的變量,例如某種類型的過濾器子句? – mellamokb 2011-05-17 03:19:09

+0

你的例子是不相關的,因爲它不使用LINQ to SQL。我們不知道LINQ to SQL如何處理或編譯由這兩個表達式表示的表達式樹。最好的測試是打開SQL Profiler並比較生成的查詢。關鍵是,它是依賴於實現的,並且您正在測試錯誤的實現。 – 2011-05-17 03:32:27