背景(即到底是什么相对互补?)
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的所有性能
缺点:
有些人会将此视为不支持的功能。