#sql #linq #linq-to-sql #dynamics-crm #crm
#sql #linq #linq-to-sql #динамика-crm #crm
Вопрос:
Я пытаюсь получить список записей из объекта crm с помощью c #. Пытаюсь получить записи с идентификаторами, присутствующими в другом списке.
Вот запрос:
private static List<plus_visit> GetVisits(IOrganizationService service, List<Guid> customVendorIDs = null)
{
var visits = new List<plus_visit>();
using (var crm = new CrmServiceContext(service))
{
try
{
visits = crm.plus_visitSet.Where(a => customVendorIDs.Contains(a.ow_Vendor.Id)).ToList();
}
catch (Exception ex)
{
Utility.LogError(ex);
}
return visits;
}
Я получаю сообщение об ошибке «Недопустимое условие where. Элемент объекта вызывает недопустимое свойство или метод «.
Это работает, когда я меняю его на .tolist(), как показано ниже, но сначала требуется много времени для преобразования в list, а затем для запроса к нему.
visits = crm.plus_visitSet.tolist().Where(a => customVendorIDs.Contains(a.ow_Vendor.Id)).ToList();
plus_visit генерируется с помощью генератора ранней привязки XrmToolbox. Это выглядит как:
public System.Linq.IQueryable<CrmEarlyBound.plus_visit> plus_visitSet
{
[System.Diagnostics.DebuggerNonUserCode()]
get
{
return this.CreateQuery<CrmEarlyBound.plus_visit>();
}
}
Есть идеи, что я делаю не так?
Комментарии:
1. вы не можете использовать QueryExpression. Данные должны быть легко извлекаться из CRM и легко читаться. Попробуйте этот документ
2. Да, мне пришлось найти альтернативное решение, реализовав запрос LINQ to SQL вместо contains .
3. Если вы хотите, я могу предоставить вам код псевдонима или выражения запроса, если вы сообщите мне свои критерии.
4. Кроме того, я полагаю, что Contains не будет работать, если вы хотите фильтровать с помощью Guid, попробуйте использовать оператор In или equals
Ответ №1:
Здесь вы можете найти список ограничений LINQ. Ваш запрос подпадает под правило «Левая часть предложения должна быть атрибутом»…
Если customVendorIDs
они также извлекаются с помощью запроса LINQ, вы можете обойти это ограничение, объединив таблицы с фильтром поставщика, чтобы получить только нужные plus_visitSet
записи.
Пожалуйста, обратите внимание, что с crm.plus_visitSet. ** tolist() ** ...
помощью запроса вы извлекаете все plus_visit
записи из базы данных, а затем отфильтровываете их. Это может существенно повлиять на производительность….