【问题标题】:CRM 2011 LINQ query with multiple inner joins and a single WHERE clause (VB .NET)CRM 2011 LINQ 查询具有多个内部连接和单个 WHERE 子句 (VB .NET)
【发布时间】:2011-09-01 15:48:04
【问题描述】:

我在尝试让 LINQ 查询与 CRM 2011 一起工作时遇到了很多困难。每当我有三个或更多连接表时就会出现问题(似乎与哪个 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

感谢您的帮助!

【问题讨论】:

  • 不使用 svcContext.LeadSet 为什么要加入它?

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


【解决方案1】:

我没有设置 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

几个 cmets:与 TSQL 不同,LINQ 中的操作顺序更加灵活。这样,您可以在进行联接之前限制您的第一个表(取决于 CRM 提供商的翻译方式)。

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

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

【讨论】:

  • 感谢吉姆的回复。我已经尝试过您建议的方法,我只是再次尝试了您的代码。当另一个 JOIN 跟随它时,它不喜欢 WHERE 子句。我收到错误消息“'Join' 方法不能遵循 'Where' 方法或不受支持。请尝试根据支持的方法编写查询,或在调用不受支持的方法之前调用 'AsEnumerable' 或 'ToList' 方法。”我将使用“Leads”表以及结果集中的更多字段。这只是我正在尝试做的事情的简化版本,无论如何都会得到相同的错误。
  • 不幸的是,这听起来像是 CRM 提供商的限制。尝试向供应商提供反馈。如果是 Microsoft,请尝试在 connect.microsoft.com 上发帖
猜你喜欢
  • 1970-01-01
  • 2018-06-19
  • 1970-01-01
  • 2019-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多