根据评级MVC显示项目

时间:2015-12-06 12:24:16

标签: c# asp.net asp.net-mvc asp.net-mvc-4 rating

我有一个产品表,其中包含列" ProductId(pk),P_Name,Price,Quantity"

和另一个表 VoteLogs ,其中列为" V_id(pk),ProductId,UserId,Vote"

我已按照this tutorial

实施了评分功能

投票日志表包含以下数据

VoteLog Table Data

您可以看到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);
    }

我得到了理想的结果:

Result of query

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

3 个答案:

答案 0 :(得分:1)

请参阅以下代码。

您可以更改userId并验证输出。

    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();
        }
    }

答案 1 :(得分:1)

将其分解为各个组成部分

首先,您需要获取当前用户投票的产品的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 View(db.Products.Where(p => likeProducts.Contains(p.ID)));

根据您显示的表格,这将返回产品207211871188。如果您要使用ProductId = 109UserName = "customer1@gmail.com"向投票表添加另一行,则结果将为192030,{{1} },7211111187

请注意,由于您可能拥有数千个用户和产品,因此可能会向视图返回数千种产品,因此您可能需要考虑限制结果,例如,您可以按{1188查询likeProducts查询1}}(最高)并且仅采用顶部#。

答案 2 :(得分:1)

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

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();

添加了ToList()。

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