2015-10-09 2 views
2

У меня есть запрос LINQ. Я пытаюсь свести к минимуму, но при попытке получить сообщение об ошибке. Genkai_db - это экземпляр Entity Framework, и я запрашиваю sql-таблицу.Refactorise Linq query

Это работает:

public UNITY_DB_PRODEntities12 Genkai_db = new UNITY_DB_PRODEntities12(); 


    public List<string[]> Query_FpacInactif() 
    { 
     List<string[]> li = new List<string[]>(); 
     List<string> u = Genkai_db.final_full_data 
      .Where(x => x.FPAC_TimeStamp > 100) 
      .Select(x => x.computername) 
      .ToList<string>(); 
     foreach (string a in u) 
     { 
      string[] Sarray = new string[] { a, "FPAC" }; 
      li.Add(Sarray); 
     } 

     return li; 
    } 

В другой аналогичной функции я попытался реорганизовать в одну строку:

public List<string[]> Query_McAfeeConsolidation() 
{ 
    List<string[]> li = (Genkai_db.Consolidation_McAfee 
     .Select(x => new string[] { x.computername, "McAfee" })) 
     .ToList(); 
    return li; 
} 

Последняя функция завершилась с ошибкой:

Unable to initialize the array of type 'System.String []' in a query result. Use 'System.Collections.Generic.List`1 [System.String]' instead.

PS: Я пробовал много вещей, прежде чем спрашивать, используя List<string> по телефону string[], но не hing работал в одной строке.

+0

Было бы полезно, если бы вы могли показать нам, как выглядит ваш входной объект, и что именно вы пытаетесь получить в результате – pquest

+0

Просьба предоставить информацию о типе 'Consolidation_McAfee'. –

+0

Почему первый метод выбирает «Genkai_db.final_full_data», а второй - «Genkai_db.Consolidation_McAfee»? Это ошибка? –

ответ

4

Я думаю, что он не может перевести его в SQL-запрос, вы можете вернуть его в память с помощью AsEnumerable и проекта.

на основе исходного запроса вы всегда можете фильтровать записи в SQL, проницаемые нагрузки запроса все данные в памяти, которая не является хорошим, очевидно, (но писал, что на основании метода Query_McAfeeConsolidation): -

List<string[]> li = Genkai_db.Consolidation_McAfee 
          .Where(x => x.FPAC_TimeStamp > 100) 
          .Select(x => x.computername) 
          .AsEnumerable() 
          .Select(x => new string[] { x, "McAfee" })) 
          .ToList(); 
+0

его работая, так что, если я понимаю, что EF не может выполнить результат в результате одного запроса запроса в список , я получаю его в 2 раза. – Zwan

+0

@Zwan - Да, он переводит запрос на SQL, и его провайдер не поддерживает проектирование массивов. Или даже любой другой метод C#, например 'String.Join'. –

0

Linq похоже, не работает с массивами.

Список Использование < Список < строка > > вместо:

public List<List<string>>> Query_McAfeeConsolidation() 
    { 
     List<List<string>> li = Genkai_db.Consolidation_McAfee 
             .Select(x => new List<string> { x.computername, "McAfee" }) 
             .ToList(); 
     return li; 
    } 
3

Это должно работать

return Genkai_db.final_full_data 
    .Where(x => x.FPAC_TimeStamp > 100) 
    .Select(x => x.computername) 
    .AsEnumerable() 
    .Select(cn => new string[] { cn, "FPAC" }) 
    .ToList(); 

Это будет запрашивать computername из БД, а затем создать массив в памяти, потому что AsEnumerbale будет переход от EF к Linq-to-objects.