Тип узла выражения LINQ ‘ArrayIndex’ не поддерживается LINQ to Entities — с использованием интерфейса и ReportViewer

#interface #linq-to-entities #reportviewer

#интерфейс #linq-to-entities #reportviewer

Вопрос:

на самом деле, небольшой вопрос.
Я пытаюсь реализовать оператор Linq2Entities, который мог бы принимать более одного значения для определенного «поля». Я передаю несколько строк в getClientsProjected() я могу легко сравнить одно значение. Но у меня на моей странице есть несколько выпадающих списков, и из них я получаю строку, разделенную coma, которую я позже использую для разделения на string[] например __ACCOUNT_SITE = "1234,5678" (см. Код ниже) Я пробовал для /foreach / contains, ни один из которых не сработал…

 public IQueryable<ClientViewModel> getClientsProjected(string __ACCOUNT_SITE, string __ACCOUNT)
{
    var projectedClients = from c in getClosedSRs()
                           select new ClientViewModel
                           {
                               _ACCOUNT_ID_CSR = c.ACCOUNT_ID_CSR,
                               _ACCOUNT = c.ACCOUNT,
                               _ACCOUNT_FAMILY = c.ACCOUNT_FAMILY,
                               ...
                               ...
                               _ACCOUNT_SITE = c.ACCOUNT_SITE
                           };

    if (String.IsNullOrEmpty(__ACCOUNT) != true amp;amp; __ACCOUNT != "ALL")
    {
        //this works fine as an __ACCOUNT is of a single value
        projectedClients = projectedClients.Where(c => c._ACCOUNT == __ACCOUNT);
    }

    if (String.IsNullOrEmpty(__ACCOUNT_SITE) != true amp;amp; __ACCOUNT_SITE != "ALL")
    {
        String[] splitSites = __ACCOUNT_SITE.Split(',');
        //????????????????????????????????????????????????
    }
    return projectedClients;
}
  

Теперь для большинства из вас это будет иметь полный смысл. Я прочитал много статей, но не нашел правильного ответа. Однако я не могу использовать Linq2SQL, поскольку уже создал весь свой сайт с использованием L2E, интерфейса и ReportViewer.

Есть обходной путь?

Ответ №1:

Если вы пытаетесь отфильтровать projectedClients на основе значений в splitSites, тогда используйте:

 if (String.IsNullOrEmpty(__ACCOUNT_SITE) != true amp;amp; __ACCOUNT_SITE != "ALL")
{
    String[] splitSites = __ACCOUNT_SITE.Split(',');
    projectedClients = projectedClients.Where(x => splitSites.Contains(x._ACCOUNT);
}
  

Комментарии:

1. Я попробовал это и получил следующую ошибку: LINQ to Entities не распознает метод ‘Boolean содержит [строку] (System. Коллекции. Общий. IEnumerable`1[Система. Строка], система. Метод ‘String)’, и этот метод не может быть преобразован в выражение хранилища.

2. Сначала вам нужно создать список<строка>. Попробуйте использовать: List<string> splitSites = __ACCOUNT_SITE.Split(',').ToList(); вместо массива.

3. Я добавил ToList(); выше для преобразования в список.

4. Спасибо, Леонс, это сработало без разделения: » projectedClients = Проектные клиенты. Где(c => __ACCOUNT_SITE. Содержит(c._ACCOUNT_SITE)): » Раньше я делал это по-другому, так что я в большом долгу перед вами!