Использовать Entity Framework Выберите одну строку. Entity Framework не сгенерировал инструкцию sql, верно?

Я использую Entity Framework в качестве поставщика данных. И есть одна конкретная таблица, которая не сгенерировала правильный оператор sql. Хотя я передал условие запроса, но Entity Framework по-прежнему генерирует оператор sql для всей таблицы.

Код такой:

public IList<Device> GetDeviceByNodeId(string nodeId)
        => GetModels(device => device.DeviceNodeId == nodeId).ToList();

public virtual IEnumerable<T> GetModels(Func<T, bool> exp)
        => EntitySet.Where(exp);

И сгенерированный оператор sql выглядит так:

SELECT 
[Extent1].[Id] AS [Id], 
[Extent1].[DeviceTypeId] AS [DeviceTypeId], 
[Extent1].[OriginalDeviceId] AS [OriginalDeviceId], 
[Extent1].[DeviceCode] AS [DeviceCode], 
[Extent1].[StatCode] AS [StatCode], 
[Extent1].[DevicePassword] AS [DevicePassword], 
[Extent1].[DeviceModuleGuid] AS [DeviceModuleGuid], 
[Extent1].[DeviceNodeId] AS [DeviceNodeId], 
[Extent1].[FirmwareSetId] AS [FirmwareSetId], 
[Extent1].[ProjectId] AS [ProjectId], 
[Extent1].[StartTime] AS [StartTime], 
[Extent1].[PreEndTime] AS [PreEndTime], 
[Extent1].[EndTime] AS [EndTime], 
[Extent1].[Status] AS [Status], 
[Extent1].[CameraId] AS [CameraId], 
[Extent1].[DomainId] AS [DomainId], 
[Extent1].[CreateDateTime] AS [CreateDateTime], 
[Extent1].[CreateUserId] AS [CreateUserId], 
[Extent1].[LastUpdateDateTime] AS [LastUpdateDateTime], 
[Extent1].[LastUpdateUserId] AS [LastUpdateUserId], 
[Extent1].[IsDeleted] AS [IsDeleted], 
[Extent1].[IsEnabled] AS [IsEnabled]
FROM [dbo].[Devices] AS [Extent1]

Я использовал linq неправильно?


person Autyan    schedule 26.05.2016    source источник
comment
что такое тип EntitySet?   -  person Adil Mammadov    schedule 26.05.2016


Ответы (1)


Это потому, что вы используете функцию, а не выражение.

Помните, что IQueryable также являются IEnumerable, поэтому на самом деле вы вызываете Enumerable.Where, а не Queryable.Where. Это заставит Entity Framework выполнить запрос и отфильтровать результаты в памяти.

Измените подпись метода с:

public virtual IEnumerable<T> GetModels(Func<T, bool> exp)

to

public virtual IEnumerable<T> GetModels(Expression<Func<T, bool>> exp)

Дополнительную информацию о различиях между выражениями и Функции.

person iggymoran    schedule 26.05.2016
comment
Без проблем. Отметьте это как ответ, пожалуйста. - person Murray Foxcroft; 26.05.2016