2012-05-02 1 views
1

Мне любопытно, есть ли способ использования Linq to Entities для проекта в новый объект, добавьте расширения .Where к исходному Linq запрос (отложенное выполнение и некоторое построение динамических лямбда-выражений) для дальнейшего фильтрации запроса на основе свойств проецируемого объекта, но (и вот главный вопрос) ТОЛЬКО возвращает свойство ONE (например, поле ID) из базы данных (выберите оператор генерирует только одно возвращаемое значение).Linq to Entities - проект в объект, поиск по всем полям, но возврат только одного свойства

Так что я хочу, чтобы изменить следующие параметры:

 employees = from e in context.Employee 
        select new EmployeeObject() 
        { 
          EmployeeId = e.EmployeeId, 
          EmployeeFirstName = e.FirstName, 
          EmployeeLastName = e.LastName 
        }; 

Так что я могу добавить сотрудник с расширениями .гда с лямбдой для дальнейшего сужения поиска, но только вернуть EmployeeID и иметь SQL, генерируемый отражают это.

Я все еще участвую в Linq для Entities, поэтому, пожалуйста, простите меня, если я не описал что-то должным образом.

Спасибо!

+0

Спасибо за форматирование, Botz3000. Просто повторю то, что я прокомментировал ниже: Проблема с этим заключается в том, что я не могу добавить последующие расширения .Where вместе с lambdas, которые нацелены на другие свойства в проецируемом объекте/DTO, потому что я получаю «указанный член типа» 'не поддерживается в LINQ to Entities. Поддерживаются только инициализаторы, сущности и свойства навигации сущности. " который говорит мне, что вы должны определить отношения для Linq to Entities (EF 4.1 кстати) в вашей проекции для последующего использования. Где расширения работать. – Wrasse

ответ

1

Вы можете сделать это:

var employeeIds = from e in context.Employee 
        select new { 
         EmployeeID = e.EmployeeId 
        }; 

Он будет возвращать только одно свойство, вам нужно с помощью анонимного типа. Или альтернативно:

var employeeIds = context.Employee.Where(/*filters...*/).Select(e => e.EmployeeId); 
// another alternative: 
var employeeIds = from e in context.Employee select e.EmployeeId; 

Это даст вам только идентификаторы.

EDIT:
Пока вы не перечислить через запрос, запрос не выполняется.
Так что, если вы говорите

var query = context.Employee; 

у вас есть очень простой запрос, который вы можете украсить дополнительными пунктами так же, как вам нравится:

query = query.Where(e => e.LastName.StartsWith("S")); 
query = query.Where(e => e.FirstName == "Blah"); 

Все эти дополнения не выполняет запрос, так если ваш ObjectContext действителен, вы можете уточнить свой запрос таким образом.

Когда вы закончите добавлять пункты, вы можете добавить окончательный прогноз

var results = query.Select(e => e.EmployeeId); 

и только тогда вы должны перечислить через results или использовать его где-нибудь. Конечно, вы можете только добавить проекцию после, вы выполнили свою фильтрацию, потому что по определению проекция просто отбрасывает все свойства, отличные от EmployeeId.

+0

Я ценю ваше время и помощь. Проблема с этим заключается в том, что я не могу добавить последующие расширения .Where вместе с lambdas, которые нацелены на другие свойства в проецируемом объекте/DTO, потому что я получаю эту ошибку. «Указанный член типа <Член, который Lambda был targetting>», не поддерживается в LINQ to Entities. Поддерживаются только инициализаторы, сущности и свойства навигации сущности ». который говорит мне, что вы должны определить отношения для Linq to Entities (EF 4.1 кстати) в вашей проекции для последующего использования. Где расширения работать. – Wrasse

+0

Если я это сделаю, генерируемый SQL возвращает все, и я не могу заставить его искать все, но только возвращает Id. Я уверен, что мне не хватает чего-то очень простого здесь ... спасибо! – Wrasse

+1

@Wrasse Если я правильно понимаю, вы пытаетесь продолжить фильтрацию результатов ** после ** вы выбрали только идентификатор? Это не будет работать из-за типа результатов запроса. Вам придется подождать с фактическим выбором, пока вы не добавите все предложения 'where'. – Botz3000

0

Не уверен, что я полностью понимаю, но не могли бы вы сделать:

context.Employee.Where(x => x.FirstName = "Bob").Select(x => x.Id); 
Смежные вопросы