Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Linq在三个表上进行内部联接_C#_Mysql_Asp.net Mvc_Linq_Lambda - Fatal编程技术网

C# 使用Linq在三个表上进行内部联接

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

当其中一个表使用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
            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