具有多个内部联接和单个WHERE子句的CRM 2011 LINQ查询(VB .NET)

时间:2011-09-01 15:48:05

标签: linq join inner-join crm dynamics-crm-2011

我正在努力让LINQ查询与CRM 2011一起工作。每当我有三个或更多连接表(似乎没关系哪个CRM表)时会出现问题,并且我尝试添加一个WHERE子句(我在哪个表上过滤无关紧要)。如果我删除WHERE子句,查询运行正常,我可以遍历结果集。我也可以保留WHERE子句,但删除第三个连接,它也可以。我已经尝试了很多CRM实体,并得到相同的错误“'Join'操作的结果选择器必须返回两个属性的匿名类型。”看来存在一个限制,如果我想使用单个WHERE子句,我只能加入两个表。

我在发出LINQ查询时使用早期绑定CRM Context生成的代码方法。这是从CRM SDK示例中提取的代码,除了我添加了WHERE子句。我无法在任何地方找到如何做到这一点的例子。

Dim MyVar = From a In svcContext.AccountSet _
Join c In svcContext.ContactSet On a.PrimaryContactId.Id Equals c.ContactId _
Join l In svcContext.LeadSet On a.OriginatingLeadId.Id Equals l.LeadId _
Where a.Name.Contains("c") _
Select New With {c.FullName}

For Each MyItem In MyVar
   Debug.Print(MyItem.FullName)
Next

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我没有设置CRM来测试它是否只是其提供商的限制,但您可以尝试以下方法:

Dim MyVar = From a In svcContext.AccountSet _
    Where a.Name.Contains("c") _
    Join c In svcContext.ContactSet On a.PrimaryContactId.Id Equals c.ContactId _ 
    Join l In svcContext.LeadSet On a.OriginatingLeadId.Id Equals l.LeadId _ 
    Select c.FullName

一些评论:与TSQL不同,LINQ中的操作顺序更加灵活。这样,您可以在进行连接之前限制第一个表(取决于CRM提供程序的转换方式)。

其次,你想知道名字中的“c”在哪里,或者只是在开头?如果一开始,请考虑Where a.Name.StartsWith("c") 另外一条评论,在你的Select投影中,你不必要地投射到一个可枚举的类中。如果您只是预测单个值,则不需要额外的类开销。然后在你的foreach中,只需执行Debug.Print(MyItem),因为MyItem是全名。同样在VB中,使用查询语法时,您不需要New With {...}。如果您想要生成具有多个列的匿名类型,您可以在VB中执行以下操作,就像在SQL中一样:

Dim query = From c In Customers
            Select C.FullName, C.CompanyName