我在尝试使用CRM 2011进行LINQ查询时遇到了很大的困难。每当我有三个或更多的连接表(似乎与哪个CRM表无关),并且我尝试添加WHERE子句(与我正在过滤的表无关)时,问题就会出现。如果删除WHERE子句,查询就可以正常运行,并且可以遍历结果集。我也可以保留WHERE子句,但删除第三个连接,它也可以工作。我已经对许多CRM实体进行了尝试,并得到了相同的错误:“'Join‘操作的结果选择器必须返回两个属性的匿名类型。”似乎有一个限制,如果我想使用一个WHERE子句,我只能连接两个表。
在发出LINQ查询时,我使用了早期绑定CRM上下文生成的代码方法。这是从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
感谢您的帮助!
发布于 2011-09-02 01:40:43
我没有设置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
https://stackoverflow.com/questions/7272891
复制相似问题