2010-11-03 42 views
0

大家晚上好,努力工作閾值到LINQ查詢(IES)

我一直在試圖找出最有效的方式做到這一點,但我未能達到。這是怎麼回事......

我最終試圖根據特定客戶的購買習慣和給定的門檻,例如50%來確定「喜歡的客戶」。 IE客戶1購買了產品A,B,C,D ......客戶2購買了B,C,D,E ......這兩個客戶都是> = 50%「相似性」,因此它們應該匹配。

我的架構是可以預期

CLIENT (1 ----- many) CLIENT_PURCHASE (1 -------many) PRODUCT 

*clientID   *clientID *prodID     *prodID 

現在我忽略的門檻,只是想找到誰購買1號客戶的歷史記錄中的任何項目的客戶。我認爲我有以下兩個查詢工作:

var clientOneHistory = (from cp in client.Client_Purchase 
         select cp.prodID).ToList(); 

var matchedClients = (from cp in db.Client_Purchase 
         where clientOneHistory.Contains(cp.prodID) 
         select cp.Client.fullname).Distinct().ToList(); 

所以我最終的問題是,「我如何在閾值部分工作? 感謝您的時間

+0

說客戶1購買A,B和客戶2購買A,B,C,D他們是100%相同還是50%相同? – spender 2010-11-03 01:45:03

+0

對不起,我應該更清楚一點關於門檻。 簡而言之,我想比較客戶1的購買與其他人的購買。如果顧客1購買了A B,並且顧客2購買了A B C D,則在購買顧客1的100%購買時,顧客2在技術上將超過最低所需閾值50%。 總的百分比將超出客戶1的購買。如果客戶2只購買了A,他將是50%「喜歡」客戶1.希望這足夠清楚。請讓我知道任何其他澄清。再次感謝各位 – dahnealdo 2010-11-03 02:00:46

回答

0

我不確定如何爲您的特定情況形成這些查詢。假設你想使用LINQ到SQL。相反,我將使用NorthWind數據庫作爲示例來做同樣的事情。然後你可以在你的實現中使用這裏使用的想法。我不認爲完全可以使用LINQ到SQL來完成這個任務,你必須進行混合。

var threshold = 0.5M; 

// let's pick a customer id 
var myId = "VINET"; 

// get products of current customer 
var myProducts = (from c in db.Customers 
        where c.CustomerID == myId 
        join o in db.Orders on c.CustomerID equals o.CustomerID 
        join od in db.Order_Details on o.OrderID equals od.OrderID 
        select od.ProductID) 
       .Distinct() 
       .ToArray(); 

// get the products of all other customers 
var others = (from c in db.Customers 
       where c.CustomerID != myId 
       join o in db.Orders on c.CustomerID equals o.CustomerID 
       join od in db.Order_Details on o.OrderID equals od.OrderID 
       group od.ProductID by c.CustomerID into g 
       select new { CustomerID = g.Key, Products = g.Distinct() }) 
      .AsEnumerable(); 

// calculate "likeness" values for each person 
var likeness = from o in others 
       let Percent = Decimal.Divide(myProducts.Intersect(o.Products).Count(), myProducts.Length) 
       where Percent >= threshold 
       select new { o.CustomerID, Percent }; 
+0

想過之後,我想你會對最後一次查詢感興趣。 – 2010-11-03 05:01:50

+0

感謝您的建議,我喜歡解決方案。我有點意識到,當你把它分解到最低層時,我基本上比較了兩個常見元素的列表,這可以用intersect()方法很好地完成。有了這些可用,肯定會使得獲得百分比更加可行/高效,因爲您做得很好。再次感謝 – dahnealdo 2010-11-03 14:07:47