2

当其中一个表使用 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:{消息:“发生错误。”,ExceptionMessage:“'where子句'中的未知列'Project2.idpictures'”,ExceptionType:“MySql.Data.MySqlClient.MySqlException”,StackTrace:“在MySql.Data。 MySqlClient.MySqlStream.ReadPacket() 在 MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int64& insertedId) 在 MySql.Data.MySqlClient.Driver.GetResult(Int32 statementId, Int32& affectedRows, Int64& insertedId) 在 MySql.Data.MySqlClient .Driver.NextResult(Int32 statementId, Boolean force) at MySql.Data.MySqlClient.MySqlDataReader.NextResult() 在 MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior 行为) 在 MySql.Data.Entity.EFMySqlCommand.ExecuteDbDatoiaReader(CommandBehavior 行为) 在 System.Data.Common。DbCommand.ExecuteReader(CommandBehavior 行为)在 System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand,CommandBehavior 行为)“}

我的查询合法吗?使用 groupby 时是否可以进行三个内连接。

4

2 回答 2

2

查询提供程序无法处理复杂的操作来确定“加入”的每个集合的身份。

幸运的是,您不需要做像您正在做的那样复杂的事情。而不是FirstOrDefault在连接比较中使用来获取您要分组的字段,只需使用组的键:

join p in db.picturedetails on pgroup.Key equals p.idpictures

您可以也应该Key在查询的其他地方使用。

如果你想让读者更清楚他们的关键是什么,并且想要一个更好的变量名,只需使用 a 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
于 2013-09-30T15:13:42.957 回答
0

尝试改变:

group l by l.idpictures into pgroup

至:

group l by new { l.idpictures,l.idgroup } into pgroup

您可能必须更改您对pgroup.FirstOrDefault().idpicturesto的引用pgroup.idpictures

或者,重新设计您的小组,以便您先加入,然后再组。

于 2013-09-30T14:41:48.457 回答