получить данные с помощью contains() в запросе linq to sql

#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 записи из базы данных, а затем отфильтровываете их. Это может существенно повлиять на производительность….