gpt4 book ai didi

c# - 使用 Linq 对三个表进行内部联接

转载 作者:行者123 更新时间:2023-11-29 02:27:25 25 4
gpt4 key购买 nike

当其中一个表使用 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: "An error has occurred.", ExceptionMessage: "Unknown column 'Project2.idpictures' in 'where clause'", ExceptionType: "MySql.Data.MySqlClient.MySqlException", StackTrace: " at MySql.Data.MySqlClient.MySqlStream.ReadPacket() at 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 force) at MySql.Data.MySqlClient.MySqlDataReader.NextResult() at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior) at MySql.Data.Entity.EFMySqlCommand.ExecuteDbDatoiaReader(CommandBehavior behavior) at System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior) at System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior)" }

我的查询是否合法?是不是用groupby的时候做三个inner join的方法。

最佳答案

查询提供者无法处理确定“连接”的每个集合的身份的复杂操作。

幸运的是,您不需要做像您正在做的那么复杂的事情。与其在连接比较中使用 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

关于c# - 使用 Linq 对三个表进行内部联接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19096326/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com