Запрос CRM 2011 LINQ с несколькими внутренними объединениями и одним предложением WHERE (VB .NET) - PullRequest
0 голосов
/ 01 сентября 2011

У меня много трудностей с попыткой заставить запросы LINQ работать с CRM 2011. Проблема возникает, когда у меня есть три или более объединенных таблиц (кажется, не имеет значения, какие таблицы CRM), и я пытаюсь добавитьПредложение WHERE (не имеет значения, по какой таблице я фильтрую).Если я удаляю предложение WHERE, запрос выполняется нормально, и я могу просмотреть набор результатов.Я также могу оставить предложение WHERE, но удалить третье соединение, и оно также работает.Я пробовал это с многочисленными объектами CRM, и получаю ту же ошибку: «Селектор результатов операции« Присоединиться »должен возвращать анонимный тип двух свойств».Кажется, есть ограничение, что если я хочу использовать одно предложение WHERE, я ограничен объединением только двух таблиц.

Я использую метод сгенерированного кода контекста раннего связывания при выдаче запроса LINQ.Это код, извлеченный из примеров 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 голосов
/ 01 сентября 2011

У меня не настроен 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
...