我期待,因爲雖然它的作品的權利,它生成的SQL是令人費解的和低效的優化我的LINQ查詢...有助於優化LINQ查詢
基本上,我期待客戶選擇(如CustomerDisplay對象)誰下令要求的產品(reqdProdId),並用信用卡號(存儲在RegisteredCustomer表中的一行與外鍵CUSTID)
var q = from cust in db.Customers
join regCust in db.RegisteredCustomers on cust.ID equals regCust.CustId
where cust.CustomerProducts.Any(co => co.ProductID == reqdProdId)
where regCust.CreditCardNumber != null && regCust.Authorized == true
select new CustomerDisplay
{
Id = cust.Id,
Name = cust.Person.DisplayName,
RegNumber = cust.RegNumber
};
作爲概述註冊,客戶有相應的人員,其有姓名; PersonID是Customer表中的外鍵。 如果我查看生成的SQL,我會看到從Person表中選擇的所有列。 Fyi,DisplayName是使用Customer.FirstName和LastName的擴展方法。任何想法如何限制人員列?其次,我想擺脫Any子句(並使用子查詢)來選擇所有具有所需ProductID的CustomerIds,因爲它(可以理解)生成一個Exists子句。你可能知道,LINQ有一個已知的聯結表問題,所以我不能只做一個cust.CustomerProducts.Products。 如何使用所需的ProductID選擇聯結表中的所有客戶?
任何幫助/建議表示讚賞。
thansk Lame Duck,從來沒有想過編譯LINQ ...會研究它。這是一些很好的功能性編程的東西。 另外,我確實有客戶和RegisteredCustomer之間的外鍵,我不知道有什麼不同 custProd.Customer.RegisteredCustomer.CreditCardNumber!= NULL之間 (你的建議) 和 custProd.CreditCardNumber! = NULL(像我) LINQ數字出custProd是在加入該行,生成的SQL是 INNER JOIN RegisteredCustomer作爲t1.Id = t2.CustomerID ... ... T2 T2 .CreditCardNumber IS NOT NULL – 2009-07-16 01:00:29
重新編譯查詢:查詢仍在運行時編譯,而不是在編譯時編譯。如果您多次使用相同的查詢,這隻會有所幫助,因爲您可以緩存已編譯的查詢並重新使用它。 – Lucas 2009-08-27 17:24:11