2011-11-30 153 views
2

對於下面的(我使用EF4)我需要在一個線程(ContactThreadId)的未讀鑑於以選中所有郵件登錄IDLINQ - 在相關對象選擇查詢實體框架(EF4)

enter image description here

所以,我基於ContactThreadId和LoginId,我需要知道這個LoginId是否已經讀取了線程中的所有消息。如果沒有,我需要更新ContactReadState與他/她的LoginId和他/她閱讀時從線程的所有消息。

我已經試過這些,但我堅持:

// Update read state 
var thread = this.contactMessageThreadRepository.GetRow(id); 
var loginEntity = this.loginRepository.GetRow(ProfileContext.LoginId); 

var unreadMsg = loginEntity.Contact 
    .Where(x => x.ContactThread.Any(y => y.ContactThreadId == id)) 
    .Select(b => b.ContactMessage.FirstOrDefault()) 
    .Where(q => q.ContactReadState.Count() == 0); 

var unreadMsg = loginEntity.Contact 
    .Where(x => x.ContactThread.Any(y => y.ContactThreadId == id)) 
    .Where(y => y.ContactReadState.Any(q => q.ContactId != loginEntity.ContactId)); 

var msg = thread.Contact 
    .Where(x => x.LoginId == loginEntity.LoginId) 
    .Where(y => y.ContactReadState.Count() == 0); 

請幫助。 感謝

編輯

登錄 - 此表hols登錄/管理員記錄

聯繫 - 該表保存的所有聯繫人(包括登錄項目,因爲登錄還可以參加對話 - 可以回覆消息等)當聯繫表中的登錄IDNOT NULL,這意味着它是一個登錄用戶,否則它是公共用戶提交消息。

的問題 - >每個登錄只能有1 聯繫記錄(我有一個在登錄創建創建聯繫記錄觸發)。我如何使它成爲1比1。 我已經添加了FK從聯繫登錄表,但由於某種原因EF創建0..1 - > *關聯。它應該是1到1.對於一個給定的登錄,只能有1個聯繫人與該LoginId。

只要登錄正在查看新的記錄被插入到ContactReadState爲登錄(標記通過登錄閱讀郵件的郵件列表(與使用ContactID爲登錄)。

+0

地獄,你的格式化wa真的很難讀。我希望,我已經讓這條線在邏輯上是正確的。 – Slauma

回答

2

我有一個片段,但可以」 t把它完全放在一起,特別是我不知道如何設置ContactId在新的ContactReadState對象中(見下面的???),因爲顯然給定的loginId可以有很多聯繫人。新閱讀狀態?可能我誤解了你模型中的某些內容,因爲所有這些關係對我來說看起來都很複雜

...基於contactThreadIdloginId ...

我直接使用上下文,則需要翻譯成你的資料庫結構如下:

using (var context = new MyContext()) 
{ 
    var unreadMsgs = context.ContactMessages 
     .Where(cm => cm.ContactThreadId == contactThreadId 
        && !cm.ContactReadState 
         .Any(crs => crs.Contact.LoginId == loginId)) 
     .ToList(); 
    // These should be the unread messages you want to select. 

    // Now, updating ContactReadState: 
    foreach(var unreadMsg in unreadMsgs) 
    { 
     var newContactReadState = new ContactReadState 
     { 
      ContactMessageId = unreadMsg.ContactMessageId, 
      ContactId = ???, 
      ReadDate = DateTime.Now 
     }; 
     context.ContactReadStates.AddObject(newContactReadState); 
    } 

    context.SaveChanges(); 
} 

編輯

如果我理解正確的話有可能是沒有登錄,但如果接觸有一個登錄名被唯一分配給一個聯繫人。

創造這樣的EF一比一的關係正確的要求如下:

  • 您必須刪除LoginId列,並從Contact表的對應關係(這是爲一對一的原因EF創造了許多關係)。
  • Login表中的LoginId主鍵列不能是自動生成的標識。
  • 您必須在ContactLogin表之間創建外鍵關係,其中Login中的外鍵列同時是主鍵列LoginId。因此,關係在Login.LoginId(「依賴」與FK)和Contact.ContactId(「主要」與PK)之間。

這將意味着與LoginId=x一個LoginContactContactId=x(相同值),這最終使得易於在代碼段以上填充??????簡直= loginId

編輯2

...當然你可以

.Any(crs => crs.Contact.LoginId == loginId) 

...的...

.Any(crs => crs.ContactId == loginId) 

查詢替換然後... ...(這避免了一個明目張膽的加入到Contact表)

+0

Slauma。我在上面添加了更多信息。另外,我還有一個新的編輯問題,也許你可以幫助我。謝謝 – ShaneKm

+0

@ShaneKm:看我的編輯。 – Slauma

+0

Slauma,這個作品完美!非常感謝! – ShaneKm