Попытка обработать пороговое значение в запросе linq - PullRequest
0 голосов
/ 03 ноября 2010

Добрый вечер всем,

Я пытался найти наиболее эффективный способ сделать это, но терпит неудачу.Вот как это происходит ...

В конечном итоге я пытаюсь определить «как клиентов» на основе покупательских привычек конкретного клиента и определенного порога, скажем, 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();

Итак, мой последний вопрос: «Как мне работать в пороговой части?»Спасибо за ваше время

1 Ответ

0 голосов
/ 03 ноября 2010

Я не уверен, как именно сформировать эти запросы для вашего конкретного случая.Предполагая, что вы хотите использовать LINQ-to-SQL.Вместо этого я буду использовать базу данных NorthWind в качестве примера, чтобы сделать то же самое.Затем вы можете использовать идеи, используемые здесь в вашей реализации.Я не думаю, что это возможно сделать полностью с помощью LINQ-to-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 };
...