当其中一个表使用group by时,如何对三个表进行内连接。我能够编写此查询但它在运行时返回错误。那么我应该如何修改我的查询。
var pastDate = DateTime.Now.Date.AddDays(-1);
var query = from l in db.picturelikes
where l.iddatetime > pastDate
group l by l.idpictures into pgroup
let count = pgroup.Count()
orderby count descending
join p in db.picturedetails on pgroup.FirstOrDefault().idpictures equals p.idpictures
join u in db.users on pgroup.FirstOrDefault().iduser equals u.iduser
select new SortedDto
{
IdPictures = pgroup.FirstOrDefault().idpictures,
IdUser = pgroup.FirstOrDefault().iduser,
totalrating = pgroup.Average(l => (float?)l.likenumber) ?? 0, // pl.Where(a => a.likenumber!= null).Average(c => c.likenumber)
sex =u.sex,
username =u.username,
dob = u.dob
};
return query;
这是我现有代码的例外,
InnerException:{Message:“发生错误。”,ExceptionMessage: “'where子句'中的未知列'Project2.idpictures'”, ExceptionType:“MySql.Data.MySqlClient.MySqlException”,StackTrace:“ 在MySql.Data.MySqlClient.MySqlStream.ReadPacket()处 MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int64的&安培; insertedId)at MySql.Data.MySqlClient.Driver.GetResult(Int32) statementId,Int32& affectedRows,Int64& insertedId)at MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId,Boolean 强制)在MySql.Data.MySqlClient.MySqlDataReader.NextResult()at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(的CommandBehavior 行为) MySql.Data.Entity.EFMySqlCommand.ExecuteDbDatoiaReader(的CommandBehavior 行为) System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior) 在 System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand,CommandBehavior行为)“}
我的查询合法吗?是使用groupby时进行三次内连接的方法。
答案 0 :(得分:2)
查询提供程序无法处理复杂操作以确定“连接”的每个集的标识。
幸运的是,您不需要做一些像您一样复杂的事情。而不是在联接比较中使用FirstOrDefault
来获取您正在分组的字段,只需使用组的键:
join p in db.picturedetails on pgroup.Key equals p.idpictures
您也可以在查询中的其他地方使用Key
。
如果你想让读者更清楚他们关键的是什么,所以想要一个更好的变量名,只需使用let
:
let detailsId = pgroup.Key
然后您可以在整个查询中使用detailsId
。
由于您的群组还需要具有常量userId
值,因此您应该对其进行分组,假设这些群组当前具有相同的userId
值:
group l by new{ l.idpictures, l.iduser } into pgroup
然后,您可以在相应的join
子句中访问所需密钥的属性:
join p in db.picturedetails on pgroup.Key.idpictures equals p.idpictures
join u in db.users on pgroup.Key.iduser equals u.iduser
答案 1 :(得分:0)
尝试更改:
group l by l.idpictures into pgroup
为:
group l by new { l.idpictures,l.idgroup } into pgroup
您可能需要将pgroup.FirstOrDefault().idpictures
的引用更改为pgroup.idpictures
或者,重做你的小组,然后先加入,然后再加入小组。
答案 2 :(得分:0)
试试这个,
from t1 in db.Table1
join t2 in db.Table2 on t1.field equals t2.field
select new { t1.field2, t2.field3}