根据评分显示项目 MVC

Display items based on ratings MVC

我有一个 Product table 列 "ProductId(pk), P_Name, Price, Quantity"

和另一个 table VoteLogs 列 "V_id(pk), ProductId, UserId, Vote"

我已经通过关注 this tutorial

实现了评级功能

投票记录table包含以下数据

如您所见,customer1@gmail.comcustomer2@gmail.com 都投了 product 28customer2@gmail.com 也投了 product 20, 72, 1187, and 1188

现在 customer1@gmail.com 登录后,我想显示他 product 20, 72, 1187, 1188 因为 customer1customer2 都投票了相同的产品,所以他们可能有相似的品味。

我已经尝试并走到了这一步,

public ActionResult BasedOnRating()
    {
        string UserId = User.Identity.GetUserName(); //logged in with customer1@gmail.com
        var query = from vv in db.VoteLogs
                    join pp in db.Products
                    on vv.ProductId equals pp.ProductId
                    where !(db.VoteLogs.Where(c => c.UserName == UserId)
                           .Select(c => c.Product.ProductId).ToList())
                           .Contains(vv.Product.ProductId) && (vv.UserName == "customer2@gmail.com")
                    select pp;

        return View(query);
    }

我得到了想要的结果:

但我不想在查询中写 customer2@gmail.com,如果我有 1000 多个用户怎么办。我想在这里我应该传递给相同产品投票的用户列表。我在这里很困惑。我将不胜感激任何帮助。谢谢

请参考以下代码。

您可以更改用户 ID 并验证输出。

    public class Products
    {
        public int pdid { get; set; }
        public string pdname { get; set; }
    }
   public class Votes
    {
        public int pdid { get; set; }
        public string cust { get; set; }
        public int vt { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            List<Products> pd = new List<Products>()
            {
                new Products{pdid=1, pdname="abc"},
                new Products{pdid=2, pdname="ghi"},
                new Products{pdid=3, pdname="mnp"},
                new Products{pdid=4, pdname="pqr"},
                new Products{pdid=5, pdname="xyz"}

            };

            List<Votes> vt = new List<Votes>()
            {
                new Votes{pdid=1,cust="c1",vt=2},
                new Votes{pdid=2,cust="c1",vt=2},

                new Votes{pdid=1,cust="c2",vt=2},
                new Votes{pdid=3,cust="c2",vt=2},
                new Votes{pdid=4,cust="c2",vt=2},

                new Votes{pdid=2,cust="c3",vt=2},
                new Votes{pdid=5,cust="c3",vt=2}
            };

            var UserId = "c3";

            var query = (from vv in vt
                         join pp in pd
                             on vv.pdid equals pp.pdid
                         join vvv in vt
                             on vv.pdid equals vvv.pdid
                         where !(vt.Where(c => c.cust == UserId)
                             .Select(c => c.pdid).ToList())
                             .Contains(vv.pdid) && (vv.cust == vvv.cust)
                         select new
                         {
                             pdid = vv.pdid,
                             pdname = pp.pdname
                         }).Distinct();

            foreach (var p in query)
            {
                Console.WriteLine(p.pdid + "-" + p.pdname);
            }

            Console.ReadLine();
        }
    }

将其分解成各个组成部分

首先您需要获取当前用户投票的产品的 ID

string UserId = User.Identity.GetUserName();
var userProducts = db.VoteLogs.Where(v => v.UserName == userId).Select(v => v.ProductId);

然后获取所有也投票给其中一种产品的其他用户

var likeUsers = db.VoteLogs.Where(v => userProducts.Contains(v.ProductId) && v.UserName != userId).Select(v => v.UserName);

然后获取这些用户投票的所有其他产品

var likeProducts = db.VoteLogs.Where(v => likeUsers.Contains(v.UserName)).Select(v => v.ProductId).Except(userProducts);

最后return那些产品

return View(db.Products.Where(p => likeProducts.Contains(p.ID)));

根据您显示的 table,这将 return 产品 207211871188。如果您使用 ProductId = 109UserName = "customer1@gmail.com" 在投票 table 中添加另一行,那么结果将是 19203072111111871188.

请注意,由于您可能有数以千计的用户和产品,因此视图中可能 return 数以千计的产品,因此您可能需要考虑限制结果,例如您可以订购 likeProductsVote(最高)查询并仅取顶部 #.

您可以使用相同的结果集。无需再次转换为列表。

Linq查询如下:

    var query = (from vv in vt
                         join pp in pd
                             on vv.pdid equals pp.pdid
                         join vvv in vt
                             on vv.pdid equals vvv.pdid
                         where !(vt.Where(c => c.cust == UserId)
                             .Select(c => c.pdid).ToList())
                             .Contains(vv.pdid) && (vv.cust == vvv.cust)
                         select new
                         {
                             pdid = vv.pdid,
                             pdname = pp.pdname
                         }).Distinct().ToList();

已添加到列表()。

您可以在您的视图中传递查询。