内部使用Linq加入三个表

时间:2013-09-30 14:07:42

标签: c# mysql asp.net-mvc linq lambda

当其中一个表使用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时进行三次内连接的方法。

3 个答案:

答案 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}
相关问题