C# 根据项目喜好、项目连接和项目评级查找最佳项目
我有这张桌子: 普卢项目 PC_项目连接 PR_项目评级 p_项目 页面布局 这是我的链接查询:C# 根据项目喜好、项目连接和项目评级查找最佳项目,c#,linq,C#,Linq,我有这张桌子: 普卢项目 PC_项目连接 PR_项目评级 p_项目 页面布局 这是我的链接查询: List<PProject> p = ctx.PProject.Where(x => x.PCountryCode == cC && x.PParentalGuidence == r).ToList(); List<PlPageLayout> pppp = ctx.PlPageLayout.Where(x => p.Select(n =&
List<PProject> p = ctx.PProject.Where(x => x.PCountryCode == cC && x.PParentalGuidence == r).ToList();
List<PlPageLayout> pppp = ctx.PlPageLayout.Where(x => p.Select(n => n.PIdG).Contains(x.PlPId)).ToList();
通过每个项目的评分总和,哪一个项目有效并获得最佳项目,但我如何结合其他两个查询来找到最佳项目
这是答案还是只得到最后一组的查询:
List<PlPageLayout> pppp = ctx.PlPageLayout.Where(x => p.Select(n => n.PIdG).Contains(x.PlPId)).ToList();
pppp = pppp.OrderBy(c => p0.Contains(c.PlPId) ? p0.IndexOf(c.PlPId) : int.MaxValue).ToList();
pppp = pppp.OrderBy(c => p0p.Contains(c.PlPId) ? p0p.IndexOf(c.PlPId) : int.MaxValue).ToList();
pppp = pppp.OrderBy(c => p0pp.Contains(c.PlPId) ? p0p.IndexOf(c.PlPId) : int.MaxValue).ToList();
List pppp=ctx.PlPageLayout.Where(x=>p.Select(n=>n.PIdG).Contains(x.PlPId)).ToList();
pppp=pppp.OrderBy(c=>p0.Contains(c.PlPId)?p0.IndexOf(c.PlPId):int.MaxValue.ToList();
pppp=pppp.OrderBy(c=>p0p.Contains(c.PlPId)?p0p.IndexOf(c.PlPId):int.MaxValue.ToList();
pppp=pppp.OrderBy(c=>p0pp.Contains(c.PlPId)?p0p.IndexOf(c.PlPId):int.MaxValue.ToList();
每一次我喜欢一个项目,因为我正在测试它,将项目向下推,这样上面的代码就不起作用了,而是取得了一些进展
List<PlPageLayout> pppp = ctx.PlPageLayout.Where(x => p.Select(n => n.PIdG).Contains(x.PlPId)).ToList();
pppp = pppp.OrderBy(c => p0.Contains(c.PlPId) ? p0.IndexOf(c.PlPId) : int.MaxValue).ToList();
pppp = pppp.OrderBy(c => p0p.Contains(c.PlPId) ? p0p.IndexOf(c.PlPId) : int.MaxValue).ToList();
pppp = pppp.OrderBy(c => p0pp.Contains(c.PlPId) ? **p0pp**.IndexOf(c.PlPId) : int.MaxValue).ToList();
List pppp=ctx.PlPageLayout.Where(x=>p.Select(n=>n.PIdG).Contains(x.PlPId)).ToList();
pppp=pppp.OrderBy(c=>p0.Contains(c.PlPId)?p0.IndexOf(c.PlPId):int.MaxValue.ToList();
pppp=pppp.OrderBy(c=>p0p.Contains(c.PlPId)?p0p.IndexOf(c.PlPId):int.MaxValue.ToList();
pppp=pppp.OrderBy(c=>p0pp.Contains(c.PlPId)?**p0pp**.IndexOf(c.PlPId):int.MaxValue.ToList();
我已经在上整理了一些测试代码,但我不确定您的问题。我想你可以在创建结果列表时对它们进行排序,还是我只是误解了这个问题
public class PlProjectLike
{
public int PlId { get; set; }
public Guid PlPIdG { get; set; }
public int PlUId { get; set; }
public string PlValue { get; set; }
public DateTime PlCreatedDate { get; set; }
}
public class PcProjectConnect
{
public int PcId { get; set; }
public Guid PcPIdG { get; set; }
public int PcUId { get; set; }
public DateTime PcCreatedDate { get; set; }
public string PcStatus{ get; set; }
}
public class PrProjectRating
{
public int PrId { get; set; }
public int PrUId { get; set; }
public string PrText { get; set; }
public int PrValue { get; set; }
public Guid PrPIdG { get; set; }
public DateTime PrCreatedDate { get; set; }
public bool PrIsDeleted{ get; set; }
}
public class PProject
{
public int PId { get; set; }
public Guid PIdG { get; set; }
public string PName { get; set; }
public DateTime PDateCreated { get; set; }
public bool PDeleted { get; set; }
public int PUId { get; set; }
public int PTtId { get; set; }
public string PCountry { get; set; }
public string PCountryCode { get; set; }
public string PParentalGuidence { get; set; }
public string PConnectionType { get; set; }
}
public class PlPageLayout
{
public int PLId { get; set; }
public Guid PlPId { get; set; }
public string PLName { get; set; }
}
public class CTX
{
public List<PProject> PProject { get; set; }
public List<PlPageLayout> PlPageLayout { get; set; }
public List<PlProjectLike> PlProjectLike { get; set; }
public List<PrProjectRating> PrProjectRating { get; set; }
public List<PcProjectConnect> PcProjectConnect { get; set; }
public CTX()
{
PProject = new List<PProject>();
PlPageLayout = new List<PlPageLayout>();
PlProjectLike = new List<PlProjectLike>();
PrProjectRating = new List<PrProjectRating>();
PcProjectConnect = new List<PcProjectConnect>();
}
}
public class LikeGroup
{
public int sumR { get; set; }
public Guid pidG { get; set; }
}
public class Program
{
public static void Main(string[] args)
{
CTX ctx = new CTX();
String r = "R";
string cC = "us";
// Select project for country and rating
List<PProject> p = ctx.PProject.Where(x => x.PCountryCode == cC && x.PParentalGuidence == r).ToList();
// List of PlPageLayouts where the PlPId is in the selected PProject list
List<PlPageLayout> pppp = ctx.PlPageLayout.Where(x => p.Select(n => n.PIdG).Contains(x.PlPId)).ToList();
// List of Count/PlPIdG from PlProjectLike where the PlValue is 'Like' Ordered by the count descending
List<LikeGroup> plike = ctx.PlProjectLike.Where(x => x.PlValue == "Like").Select(c => c).GroupBy(g => new { g.PlPIdG }, (key, group) => new LikeGroup() { sumR = group.Count(), pidG = key.PlPIdG }).OrderByDescending(dat => dat.sumR).ToList();
// List of Sum(PrValue)/PlPIdG from PrProjectRating where PrIsDeleted is false Ordered by the Sum(PrValue) descending
List<LikeGroup> prating = ctx.PrProjectRating.Where(x => x.PrIsDeleted == false).Select(k => k).GroupBy(g => new { g.PrPIdG }, (key, group) => new LikeGroup(){ sumR = group.Sum(k => k.PrValue), pidG = key.PrPIdG }).OrderByDescending(dat => dat.sumR).ToList();
// List of Count/PlPIdG from PcProjectConnect where PcStatus is Connected Ordered by the count descending
List<LikeGroup> pconnect = ctx.PcProjectConnect.Where(x => x.PcStatus == "Connected").Select(c => c).GroupBy(g => new { g.PcPIdG }, (key, group) => new LikeGroup() { sumR = group.Count(), pidG = key.PcPIdG }).OrderByDescending(dat => dat.sumR).ToList();
List<PlProjectLike> OrderedProjectLikeList =
(from pl in ctx.PlProjectLike
join ord in plike on pl.PlPIdG equals ord.pidG
orderby ord.sumR descending
select pl).ToList();
List<PrProjectRating> OrderedPrProjectRatingList =
(from pr in ctx.PrProjectRating
join ord in prating on pr.PrPIdG equals ord.pidG
orderby ord.sumR descending
select pr).ToList();
List<PcProjectConnect> OrderedPcProjectConnectList =
(from pc in ctx.PcProjectConnect
join ord in prating on pc.PcPIdG equals ord.pidG
orderby ord.sumR descending
select pc).ToList();
}
}
公共类PlProjectLike
{
公共整数PlId{get;set;}
公共Guid PlPIdG{get;set;}
公共整数PlUId{get;set;}
公共字符串PlValue{get;set;}
公共日期时间PlCreatedDate{get;set;}
}
公共类PcProjectConnect
{
公共int PcId{get;set;}
公共Guid PcPIdG{get;set;}
公共int PcUId{get;set;}
公共日期时间PcCreatedDate{get;set;}
公共字符串PcStatus{get;set;}
}
公营评级
{
公共int PrId{get;set;}
public int PrUId{get;set;}
公共字符串PrText{get;set;}
公共int PrValue{get;set;}
公共Guid PrPIdG{get;set;}
公共日期时间PrCreatedDate{get;set;}
公共布尔值{get;set;}
}
公共类项目
{
公共int-PId{get;set;}
公共Guid PIdG{get;set;}
公共字符串PName{get;set;}
public DateTime PDateCreated{get;set;}
公共布尔PDeleted{get;set;}
公共int PUId{get;set;}
公共int PTtId{get;set;}
公共字符串PCountry{get;set;}
公共字符串PCountryCode{get;set;}
公共字符串PParentalGuidence{get;set;}
公共字符串PConnectionType{get;set;}
}
公共类页面布局
{
公共整数PLId{get;set;}
公共Guid PlPId{get;set;}
公共字符串PLName{get;set;}
}
公共级CTX
{
公共列表项目{get;set;}
公共列表PlPageLayout{get;set;}
公共列表PlProjectLike{get;set;}
公共列表PrProjectRating{get;set;}
公共列表PcProjectConnect{get;set;}
公共CTX()
{
p项目=新列表();
PlPageLayout=新列表();
PlProjectLike=新列表();
PrProjectRating=新列表();
PcProjectConnect=新列表();
}
}
公共类,如组
{
公共int sumR{get;set;}
公共Guid pidG{get;set;}
}
公共课程
{
公共静态void Main(字符串[]args)
{
CTX CTX=新CTX();
字符串r=“r”;
字符串cC=“us”;
//为国家/地区和评级选择项目
List p=ctx.PProject.Where(x=>x.pccountrycode==cC&&x.PParentalGuidence==r).ToList();
//PlPId位于所选项目列表中的PlPageLayouts列表
List pppp=ctx.PlPageLayout.Where(x=>p.Select(n=>n.PIdG).Contains(x.PlPId)).ToList();
//PlProjectLike的计数/PlPIdG列表,其中PlValue是按计数降序排列的“Like”
列出plike=ctx.PlProjectLike.Where(x=>x.PlValue==“Like”).Select(c=>c.GroupBy(g=>new{g.PlPIdG},(key,group)=>new LikeGroup(){sumR=group.Count(),pidG=key.PlPIdG}).OrderByDescending(dat=>dat.sumR.ToList();
//PrProjectRating中的总和(PrValue)/PlPIdG列表,其中PrIsDeleted按总和(PrValue)降序排列为false
List prating=ctx.PrProjectRating.Where(x=>x.PrIsDeleted==false).选择(k=>k).GroupBy(g=>new{g.PrPIdG},(key,group)=>new LikeGroup(){sumR=group.Sum(k=>k.PrValue),pidG=key.PrPIdG}).OrderByDescending(dat=>dat.sumR).ToList();
//PcProjectConnect的计数/PlPIdG列表,其中PcStatus已连接,按计数降序排列
列出pconnect=ctx.PcProjectConnect.Where(x=>x.PcStatus==“Connected”).选择(c=>c).GroupBy(g=>new{g.PcPIdG},(key,group)=>new LikeGroup(){sumR=group.Count(),pidG=key.PcPIdG}).OrderByDescending(dat=>dat.sumR.ToList();
列表OrderedProjectLikeList=
(来自ctx.PlProjectLike中的pl)
在pl.PlPIdG上的plike中加入ord等于ord.pidG
orderby ord.sumR降序
选择pl.ToList();
列表顺序PRProjectRatingList=
(来自ctx.PrProjectRating中的pr)
在pr.PrPIdG等于ord.pidG时加入ord
orderby ord.sumR降序
选择pr).ToList();
列表顺序PCProjectConnectList=
(从ctx.PcProjectConnect中的pc)
加入ord在pc上的prating.PcPIdG等于ord.pidG
orderby ord.sumR降序
选择pc.ToList();
}
}
我做了一些测试
pppp = pppp.OrderBy(c => p0.Contains(c.PlPId) ? p0.IndexOf(c.PlPId) : int.MaxValue).ToList();
List<PlPageLayout> pppp = ctx.PlPageLayout.Where(x => p.Select(n => n.PIdG).Contains(x.PlPId)).ToList();
pppp = pppp.OrderBy(c => p0.Contains(c.PlPId) ? p0.IndexOf(c.PlPId) : int.MaxValue).ToList();
pppp = pppp.OrderBy(c => p0p.Contains(c.PlPId) ? p0p.IndexOf(c.PlPId) : int.MaxValue).ToList();
pppp = pppp.OrderBy(c => p0pp.Contains(c.PlPId) ? p0p.IndexOf(c.PlPId) : int.MaxValue).ToList();
List<PlPageLayout> pppp = ctx.PlPageLayout.Where(x => p.Select(n => n.PIdG).Contains(x.PlPId)).ToList();
pppp = pppp.OrderBy(c => p0.Contains(c.PlPId) ? p0.IndexOf(c.PlPId) : int.MaxValue).ToList();
pppp = pppp.OrderBy(c => p0p.Contains(c.PlPId) ? p0p.IndexOf(c.PlPId) : int.MaxValue).ToList();
pppp = pppp.OrderBy(c => p0pp.Contains(c.PlPId) ? **p0pp**.IndexOf(c.PlPId) : int.MaxValue).ToList();
public class PlProjectLike
{
public int PlId { get; set; }
public Guid PlPIdG { get; set; }
public int PlUId { get; set; }
public string PlValue { get; set; }
public DateTime PlCreatedDate { get; set; }
}
public class PcProjectConnect
{
public int PcId { get; set; }
public Guid PcPIdG { get; set; }
public int PcUId { get; set; }
public DateTime PcCreatedDate { get; set; }
public string PcStatus{ get; set; }
}
public class PrProjectRating
{
public int PrId { get; set; }
public int PrUId { get; set; }
public string PrText { get; set; }
public int PrValue { get; set; }
public Guid PrPIdG { get; set; }
public DateTime PrCreatedDate { get; set; }
public bool PrIsDeleted{ get; set; }
}
public class PProject
{
public int PId { get; set; }
public Guid PIdG { get; set; }
public string PName { get; set; }
public DateTime PDateCreated { get; set; }
public bool PDeleted { get; set; }
public int PUId { get; set; }
public int PTtId { get; set; }
public string PCountry { get; set; }
public string PCountryCode { get; set; }
public string PParentalGuidence { get; set; }
public string PConnectionType { get; set; }
}
public class PlPageLayout
{
public int PLId { get; set; }
public Guid PlPId { get; set; }
public string PLName { get; set; }
}
public class CTX
{
public List<PProject> PProject { get; set; }
public List<PlPageLayout> PlPageLayout { get; set; }
public List<PlProjectLike> PlProjectLike { get; set; }
public List<PrProjectRating> PrProjectRating { get; set; }
public List<PcProjectConnect> PcProjectConnect { get; set; }
public CTX()
{
PProject = new List<PProject>();
PlPageLayout = new List<PlPageLayout>();
PlProjectLike = new List<PlProjectLike>();
PrProjectRating = new List<PrProjectRating>();
PcProjectConnect = new List<PcProjectConnect>();
}
}
public class LikeGroup
{
public int sumR { get; set; }
public Guid pidG { get; set; }
}
public class Program
{
public static void Main(string[] args)
{
CTX ctx = new CTX();
String r = "R";
string cC = "us";
// Select project for country and rating
List<PProject> p = ctx.PProject.Where(x => x.PCountryCode == cC && x.PParentalGuidence == r).ToList();
// List of PlPageLayouts where the PlPId is in the selected PProject list
List<PlPageLayout> pppp = ctx.PlPageLayout.Where(x => p.Select(n => n.PIdG).Contains(x.PlPId)).ToList();
// List of Count/PlPIdG from PlProjectLike where the PlValue is 'Like' Ordered by the count descending
List<LikeGroup> plike = ctx.PlProjectLike.Where(x => x.PlValue == "Like").Select(c => c).GroupBy(g => new { g.PlPIdG }, (key, group) => new LikeGroup() { sumR = group.Count(), pidG = key.PlPIdG }).OrderByDescending(dat => dat.sumR).ToList();
// List of Sum(PrValue)/PlPIdG from PrProjectRating where PrIsDeleted is false Ordered by the Sum(PrValue) descending
List<LikeGroup> prating = ctx.PrProjectRating.Where(x => x.PrIsDeleted == false).Select(k => k).GroupBy(g => new { g.PrPIdG }, (key, group) => new LikeGroup(){ sumR = group.Sum(k => k.PrValue), pidG = key.PrPIdG }).OrderByDescending(dat => dat.sumR).ToList();
// List of Count/PlPIdG from PcProjectConnect where PcStatus is Connected Ordered by the count descending
List<LikeGroup> pconnect = ctx.PcProjectConnect.Where(x => x.PcStatus == "Connected").Select(c => c).GroupBy(g => new { g.PcPIdG }, (key, group) => new LikeGroup() { sumR = group.Count(), pidG = key.PcPIdG }).OrderByDescending(dat => dat.sumR).ToList();
List<PlProjectLike> OrderedProjectLikeList =
(from pl in ctx.PlProjectLike
join ord in plike on pl.PlPIdG equals ord.pidG
orderby ord.sumR descending
select pl).ToList();
List<PrProjectRating> OrderedPrProjectRatingList =
(from pr in ctx.PrProjectRating
join ord in prating on pr.PrPIdG equals ord.pidG
orderby ord.sumR descending
select pr).ToList();
List<PcProjectConnect> OrderedPcProjectConnectList =
(from pc in ctx.PcProjectConnect
join ord in prating on pc.PcPIdG equals ord.pidG
orderby ord.sumR descending
select pc).ToList();
}
}
https://stackoverflow.com/questions/65014531/summing-a-value-inside-of-a-anonymous-type
var ratings =
from r1 in ctx.PrProjectRating
where r1.PrIsDeleted == false
group r1.PrValue by r1.PrPIdG into g
select new
{
Id = g.Key,
Sum = g.Sum(),
};
var likes =
from l in ctx.PlProjectLike
where l.PlValue == "Like"
group 1 by l.PlPIdG into g
select new
{
Id = g.Key,
Count = g.Count(),
};
var connects =
from c1 in ctx.PcProjectConnect
where c1.PcStatus == "Connected"
group 1 by c1.PcPIdG into g
select new
{
Id = g.Key,
Count = g.Count(),
};
var ids = ratings.Select(r => r.Id)
.Union(likes.Select(l => l.Id))
.Union(connects.Select(c => c.Id))
.ToHashSet();
var query =
from i in ids
join ra in ratings on i equals ra.Id into rs
from ra in rs.DefaultIfEmpty()
join l in likes on i equals l.Id into ls
from l in ls.DefaultIfEmpty()
join co in connects on i equals co.Id into cs
from co in cs.DefaultIfEmpty()
select new
{
Id = i,
Ratings = ra?.Sum ?? 0,
Likes = l?.Count ?? 0,
Connects = co?.Count ?? 0,
};
List<PlPageLayout> pppp = ctx.PlPageLayout.Where(x => p.Select(n => n.PIdG).Contains(x.PlPId)).ToList();
pppp = query.OrderByDescending(x => x.Ratings + x.Likes + x.Connects).SelectMany(j => pppp.Where(s => s.PlPId == j.Id)).ToList();