Dynamics CRM 2011 Linq Left Outer Join

时间:2013-10-09 16:26:18

标签: linq dynamics-crm-2011

我试图从不加入另一个实体的实体获取所有记录。
这就是我在SQL中尝试做的事情:

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

导致所有未连接到table2的table1行。

我在加入一个字段时与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 个答案:

答案 0 :(得分:0)

你可以用方法调用做同样的事情,但有些人往往会发现它更难阅读,因为中间有一些LAMBDA表达式。 Here是一个示例,显示两者基本相同。

我见过其他人问同样的问题,它归结为开发商的选择。我个人喜欢LINQ方法,因为我也写了一堆SQL,我可以更容易地阅读代码。