根据评分显示项目 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.com
和 customer2@gmail.com
都投了 product 28
但 customer2@gmail.com
也投了 product 20, 72, 1187, and 1188
现在 customer1@gmail.com
登录后,我想显示他 product 20, 72, 1187, 1188
因为 customer1
和 customer2
都投票了相同的产品,所以他们可能有相似的品味。
我已经尝试并走到了这一步,
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 产品 20
、72
、1187
和 1188
。如果您使用 ProductId = 109
和 UserName = "customer1@gmail.com"
在投票 table 中添加另一行,那么结果将是 19
、20
、30
, 72
、1111
、1187
和 1188
.
请注意,由于您可能有数以千计的用户和产品,因此视图中可能 return 数以千计的产品,因此您可能需要考虑限制结果,例如您可以订购 likeProducts
按 Vote
(最高)查询并仅取顶部 #.
您可以使用相同的结果集。无需再次转换为列表。
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();
已添加到列表()。
您可以在您的视图中传递查询。
我有一个 Product table 列 "ProductId(pk), P_Name, Price, Quantity"
和另一个 table VoteLogs 列 "V_id(pk), ProductId, UserId, Vote"
我已经通过关注 this tutorial
实现了评级功能投票记录table包含以下数据
如您所见,customer1@gmail.com
和 customer2@gmail.com
都投了 product 28
但 customer2@gmail.com
也投了 product 20, 72, 1187, and 1188
现在 customer1@gmail.com
登录后,我想显示他 product 20, 72, 1187, 1188
因为 customer1
和 customer2
都投票了相同的产品,所以他们可能有相似的品味。
我已经尝试并走到了这一步,
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 产品 20
、72
、1187
和 1188
。如果您使用 ProductId = 109
和 UserName = "customer1@gmail.com"
在投票 table 中添加另一行,那么结果将是 19
、20
、30
, 72
、1111
、1187
和 1188
.
请注意,由于您可能有数以千计的用户和产品,因此视图中可能 return 数以千计的产品,因此您可能需要考虑限制结果,例如您可以订购 likeProducts
按 Vote
(最高)查询并仅取顶部 #.
您可以使用相同的结果集。无需再次转换为列表。
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();
已添加到列表()。
您可以在您的视图中传递查询。