背景(即到底是什么相对互补?)

Relative Complement

我想做什么

假设我有一个自定义的Vehicle实体,该实体的VehicleType选项设置为“ Car”或“ Truck”。联系人和车辆之间存在一对多关系(即,ContactId在车辆实体上)。如何编写仅返回汽车联系方式的XRM查询(Linq To CRM,QueryExpression,提取Xml等)?

最佳答案

选项1:

我希望修改AdamV在上面提出的建议。我想不出一种单独使用Linq to CRM,查询表达式,FetchXML来回答这个特定查询的方法。 Daryl并没有提供客户端的功能,但是我想如果Linq和Query Expressions是可以接受的产品,那么.NET就可以了。创建包含父实体(在这种情况下为联系人)上相关实体的数量的聚合字段所提供的功能远远超过布尔选项。如果查询需求更改为阈值(X辆汽车以上,Y辆卡车以下,X辆和Y辆之间的总和),则布尔选项将无法传递。这个问题的客户端是未知的,但我想不出很多(任何情况下)将一组500K +行上的所有记录都拉到客户端的情况比CRM进行SQL查询的效率更高。您代表使用范围子句的几个整数字段。

上行空间:


在查询方法中保持客户的纯正
简单的客户查询
尽可能地表现出色


缺点:


汇总字段的设置
工作流或插件来管理聚合字段的增量和减量
用于初始加载聚合的SQL脚本。
风险汇总字段不同步(工作流程或插件失败)


选项2:

如果客户端内部的纯度不是必不可少的,并且.NET在桌面上,请跳过汇总字段和设置,仅对视图运行SQL。如果您不想使用ADO.NET,像Dapper,Massive或PetaPOCO这样的瘦ORM仍然可以为您提供对象模型。正如安德里亚斯(Andreas)在对OP的第一个答案的评论中所提供的那样,在SQL中似乎有些琐碎的事情。

从脑海中勾勒出一些东西:

SELECT c.*
FROM Contact
WHERE C.Contactid in (
    Select contactid
    FROM Vehicle v
    group by v.contactid , v.type
    having v.type = ‘Car’ and count(contactid) > 1
)
AND NOT IN (
    Select contactid
    FROM Vehicle v
    group by v.contactid , v.type
    having v.type <> ‘Car’ and count(contactid) > 1
)


上行空间:


工作少得多
客户关系管理实体


缺点:


根据客户端和/或应用程序的不同,混合使用DataAccess方法有点麻烦。
性能可能不如选项1


选项3:

混合匹配:从选项1中获取汇总字段。但是,请使用预定的SQL作业(或类似内容)通过与您在选项1中需要写入的初始加载作业类似的查询来更新它们

上行空间:


消除了选项1的大部分工作和风险
保留选项1的所有性能


缺点:


有些人会将此视为不支持的功能。

10-01 08:46
查看更多