這些查詢應該基本相同。 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();
}
}
當你說它不起作用時,你是什麼意思? – Gabe 2011-05-17 03:12:19
第二個數據返回的數據是什麼?我的猜測是產品ID在沿線的某處不同...... – krs1 2011-05-17 03:13:21
在第一個查詢中返回單個「產品」類。第二個查詢在傳遞相同的ID時不會返回任何內容。 – contactmatt 2011-05-17 03:14:50