C# 使用Linq在三个表上进行内部联接
当其中一个表使用GROUPBY时,如何对三个表进行内部联接。我能够编写此查询,但它在运行时返回错误。那么我应该如何修改我的查询呢C# 使用Linq在三个表上进行内部联接,c#,mysql,asp.net-mvc,linq,lambda,C#,Mysql,Asp.net Mvc,Linq,Lambda,当其中一个表使用GROUPBY时,如何对三个表进行内部联接。我能够编写此查询,但它在运行时返回错误。那么我应该如何修改我的查询呢 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
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'”,
异常类型:“MySql.Data.MySqlClient.MySqlException”,堆栈跟踪:
位于MySql.Data.MySqlClient.MySqlStream.ReadPacket()处
MySql.Data.MySqlClient.NativeDriver.GetResult(Int32&affectedRow,
在MySql.Data.MySqlClient.Driver.GetResult(Int32
语句ID、Int32和affectedRows、Int64和insertedId)位于
MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId,布尔值
位于MySql.Data.MySqlClient.MySqlDataReader.NextResult()的
MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior
行为)在
MySql.Data.Entity.EFMySqlCommand.ExecutedBDATOIReader(CommandBehavior
行为)在
System.Data.Common.DbCommand.ExecuteReader(CommandBehavior)
在
System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand
entityCommand,CommandBehavior)“}
我的询问合法吗?这是使用groupby时进行三次内部联接的方法。尝试更改:
group l by l.idpictures into pgroup
致:
您可能需要将pgroup.FirstOrDefault().idpictures
的引用更改为pgroup.idpictures
或者,重新编辑组,使您先加入,然后再加入组。查询提供程序无法处理确定“加入”的每个集合的标识的复杂操作 幸运的是,您不需要做像现在这样复杂的事情。不要在连接比较中使用
FirstOrDefault
,而是使用组的键:
join p in db.picturedetails on pgroup.Key equals p.idpictures
您可以,也应该在查询的其他地方使用键
如果您想让读者更清楚地知道它们的键是什么,从而想要一个更好的变量名,只需使用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
尝试使用
pgroup.Key
而不是pgroup.FirstOrDefault()。idpictures
pgroup.Key使我可以访问类似的键,而不是idpictures和其他。因此我无法使用pgroup加入。key@Hmmmmmmmmmm:为什么这是三个表上的联接<数据库中的code>p.picturedeails从未使用过。是的,但后来我也需要使用表3,即db.picturedeailsnew{l.idpictures,l.idgroup},我没有得到它?什么是l.IDgroups我怎样才能先加入然后再加入组,因为我需要将我的爱好分组并成为一个单一的爱好,这样才能加入它们。你能澄清一下吗?对不起,我是说新的{id.idpictures,l.iduser}这行不通。pgroup.key将使用idlike从db.picturedetails加入p.idpictures。这不是我想要的。我想用idpictures连接这两个字段。@hmmmmmmm这是您分组的字段,因此该字段的值就是键
将包含的内容。您的意思是说键将包含idpicture?是的,它正在工作。但是如何加入用户表呢?将u加入到pgroup上的db.users中。Key等于u.iduser,进入第二个不加入的位置
join p in db.picturedetails on pgroup.Key.idpictures equals p.idpictures
join u in db.users on pgroup.Key.iduser equals u.iduser