2014-01-27 3 views
1

Можно ли создать динамический селектор, как показано ниже, простым способом и как?Entity Framework LINQ - динамически выбирает свойства

 Func<Company, string> companyName = x.CompanyName; 
     Func<Company, int> companyId = x.CompanyId; 

     var result = datacontext.Select(x => new 
     { 
      CompanyName = companyName, 
     CompanyId = companyId 
     }); 

выше код генерирует исключение: «Невозможно создать постоянное значение типа«System.Func`2 ... ... Только примитивные типы или типы перечисления поддерживаются в этом контексте.»

Проблема заключается в том, что мне нужно динамически выбирать до 8 полей из возможных 50 из примерно 10 разных таблиц, и эти поля могут быть типов string, int, datetime с нулевым значением и не могут быть обнулены. Трудно динамически строить селектор с выражениями. Каков наилучший способ справиться с этим?

+0

В верхней строке, что такое значение 'x'? –

ответ

0
var result = datacontext.Select(x => new 
     { 
      CompanyName = mcname(x), 
      CompanyId = companyId(x) 
     }); 

Но где причина?

+0

Спасибо Hamlet, но это дает исключение «Тип выражения LINQ-типа« Invoke »не поддерживается в LINQ to Entities», я работаю с EF. – lekso

+0

По причине: создаю массивный фильтр поиска с динамически выбранными полями, которые позже будут отображаться в сетке. Часть фильтра завершена, но я борюсь с выражением select. Конечная цель - создать список объектов анонимного типа с фиксированным количеством свойств и привязать их к сетке результатов. – lekso

+0

ОК, вы можете использовать дерево выражений для построения запросов. http://msdn.microsoft.com/en-us/library/bb882637.aspx –

0

Ваш Funcs должен выглядеть следующим образом:

Func<Company, string> companyName = (company => company.CompanyName); 
Func<Company, int> companyId = (company => company.CompanyId); 

Чтобы использовать FUNC:

var result = datacontext.Select(x => new 
     { 
      CompanyName = companyName(x), 
      CompanyId = companyId(x) 
     }); 

я не знаю способа динамически создать запрос для конкретных полей. Вы можете динамически связывать фильтры одним исполнением, хотя ... Если вы не храните значительную информацию по каждой строке или не загружаете сотни тысяч строк, я бы не стал беспокоиться об этом.

P.S. Вы будете осторожны с использованием пользовательских функций в основных фильтрах баз данных. LINQ не может перевести все команды на собственный SQL-запрос, чтобы он мог потянуть всю таблицу и отфильтровать внутри вашего кода. Просто обратите внимание.

+1

это исключение исключений: тип узла выражения LINQ «Invoke» не поддерживается в LINQ to Entities » – lekso

0

Я не совсем уверен, что вы пытаетесь выполнить, но может ли вы, что хотите, сделать это просто так?

var result = datacontext.Select(x => new 
    { 
     CompanyName = x.companyName, 
     CompanyId = x.companyId 
    }); 
+0

Мне нужно динамически выбирают 8 из возможных 50 полей в анонимном объекте. Поля companyName и companyId являются только двумя из них. – lekso

Смежные вопросы