2013-09-30 41 views
2

如何在三個表上使用內部聯接,當其中一個表使用分組時。我能夠編寫這個查詢,但它在運行時返回錯誤。那麼我應該如何修改我的查詢。內部使用Linq加入三個表

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: 「未知列 'Project2.idpictures' 在' where子句「 」 ExceptionType: 「MySql.Data.MySqlClient.MySqlException」,堆棧跟蹤:「 在MySql.Data.MySqlClient.MySqlStream.ReadPacket()在 MySql.Data.MySqlClient.NativeDriver.GetResult(的Int32 & affectedRow, Int64 & in sertedId)在MySql.Data.MySqlClient.Driver.GetResult(的Int32 statementId,的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.ExecuteDbDatoiaReader(的CommandBehavior 行爲)在 System.Data.Common.DbCommand.ExecuteReader( CommandBehavior行爲) at System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand,Co mmandBehavior behavior)「}

我的查詢是否合法?在使用groupby時,是否需要執行三個內部聯接?

+0

嘗試使用'pgroup.Key'而不是'pgroup.FirstOrDefault()。idpictures' –

+0

pgroup.key讓我能夠訪問類似於不是idpictures和其他的鍵。 – Obvious

+0

所以我不能加入使用pgroup.key – Obvious

回答

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 
+0

這不會工作。 pgroup.key將使用idlike加入來自db.picturedetails的p.idpictures。這不是我想要的。我想加入使用idpictures。 – Obvious

+0

@Hmmmmmmmmmm這是您分組的字段,因此該字段的值是「Key」將包含的字段。 – Servy

+0

你的意思是說鑰匙將包含idpicture? – Obvious

0

嘗試改變:

group l by l.idpictures into pgroup 

到:

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

,你將有可能改變你的pgroup.FirstOrDefault().idpictures引用pgroup.idpictures

另外,返工你的小組,所以你加入,然後再組。

+0

新{l.idpictures,l.idgroup},我沒有得到它?什麼是l.idgroup – Obvious

+0

我怎樣才能加入第一個然後分組,因爲我需要我喜歡的分組,併成爲一個像他們可以加入。你能澄清嗎? – Obvious

+0

對不起,我的意思是新的{id.idpictures,l.iduser} –

0

試試這個,

from t1 in db.Table1 
join t2 in db.Table2 on t1.field equals t2.field 
select new { t1.field2, t2.field3} 
+0

親愛的讀了我的問題。 – Obvious