2013-10-09 388 views
0

我試圖從不加入其他實體的實體獲取所有記錄。
這就是我想在SQL做:Dynamics CRM 2011 Linq左外部加入

SELECT * from table1 
LEFT join table2 
ON table1.code = table2.code 
WHERE table2.code IS NULL 

它導致的是沒有加入到表2表1的所有行。

我在加入一個字段時與Linq一起工作,但我有聯繫記錄加入firstname,dob和number。

我有一個導入到「分段」實體;工作流會處理暫存記錄並在新聯繫人創建時創建聯繫人。
臨時實體幾乎是實體的副本。

var queryable = from staging in linq.mdo_staging_contactSet 
       join contact in linq.ContactSet 
       on staging.mdo_code equals contact.mdo_code 
       into contactGroup 
       from contact in contactGroup.DefaultIfEmpty() 
       // all staging records are selected, even if I put a where clause here 
       select new Contact 
       { 
        // import sequence number is set to null if the staging contact joined to the default contact, which has in id of null 
        ImportSequenceNumber = (contactContactId == null) ? new int?(subImportNo) : null, 
        /* other fields get populated */ 
       }; 
return queryable // This is all staging Contacts, the below expressions product only the new Contacts 
    .AsEnumerable() // Cannot use the below query on IQuerable 
    .Where(contact => contact.ImportSequenceNumber != null); // ImportSequenceNumber is null for existing Contacts, and not null for new Contacts 


我能做到使用方法的語法是一回事嗎?
我可以做到上述並加入多個領域?
我發現的替代方案更糟,涉及到使用newRecords.Except(existingRecords),但使用IEnumerables;有沒有更好的辦法?

+1

我只是在自己看着這個。 [這個答案](http://stackoverflow.com/a/6333207/685760)似乎表明,使用LINQ的CRM實現是不可能的。請參閱鏈接的MSDN doco的[限制](http://technet.microsoft.com/en-us/library/gg328328.aspx#limitations)部分,其中說'你不能執行外部連接' –

回答

0

你可以用方法調用做同樣的事情,但有些人往往覺得難以閱讀,因爲中間有一些LAMBDA表達式。 Here是一個例子,顯示了兩者基本相同。

我見過其他人問這個相同的問題,它歸結爲開發人員的選擇。我個人喜歡LINQ方法,因爲我也編寫了一堆SQL,我可以更容易地閱讀代碼。