我有一个产品表,其中包含列" ProductId(pk),P_Name,Price,Quantity"
和另一个表 VoteLogs ,其中列为" V_id(pk),ProductId,UserId,Vote"
我已按照this tutorial
实施了评分功能投票日志表包含以下数据
您可以看到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多个用户怎么办?我想在这里我应该通过投票相同产品的用户列表。我在这里很困惑。我将不胜感激任何帮助。感谢
答案 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)));
根据您显示的表格,这将返回产品20
,72
,1187
和1188
。如果您要使用ProductId = 109
和UserName = "customer1@gmail.com"
向投票表添加另一行,则结果将为19
,20
,30
,{{1} },72
,1111
和1187
。
请注意,由于您可能拥有数千个用户和产品,因此可能会向视图返回数千种产品,因此您可能需要考虑限制结果,例如,您可以按{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()。
您可以在视图中传递查询。