2015-05-26 3 views
8

У меня есть это в моем хранилище, и он работает, как ожидалось:Linq Найти метод, как IQueryable

public virtual EntityClass GetById(int id) 
{ 
    return db.Set<EntityClass>().Find(id); 
} 

Однако, у меня есть несколько таблиц с либо слишком много столбцов (например: 10 столбцов, где мне нужно только 3 из их) или некоторые таблицы, где у меня есть длинный текст там и снова, их не нужно брать.

Я думал, есть ли способ поиска по первичному ключу, но, возможно, получить результат IQueryable? Или, по крайней мере, то, что может позволить мне сделать что-то вроде этого:

var blah = myRepo.GetById(myId).Select(s => new {column 2, column 3, column 7}) 
+2

Как найти поиск по первичному ключу (таким образом, возвращаясь ровно один объект) - почему бы вам нужно 'возвращаемое значение IQueryAble'? – ChriPf

+2

Не получает ли IQueryable от поиска поражение цели? Поиск обычно используется, чтобы избежать поездки в базу данных. Что вы пытаетесь оптимизировать здесь? – jjj

+1

'Поиск' является немного особенным в том, что он сначала проверит в StateManager перед тем, как отправиться в Db (Store), чтобы найти объект, то есть он потенциально кэшируется и должен иметь все возвращенные поля. Если вам нужен оптимальный sql (например, для узкого индекса, а не для таблицы), используйте точку с выбранной проекцией или если вы хотите использовать 'Find', вам нужно вручную отобразить полный объект в Lite или anon class (но, похоже, мало смысла, так как это должно быть дешево для повторного использования всего объекта). – StuartLC

ответ

0
var blah = myRepo.Where(s => s.Id == myId).Select(s => new {column 2, column 3, column 7}).FirstOrDefault(); 

Если вы планируете включить Id в избранных вы можете сделать:

var blah = myRepo.Select(s => new {column 2, column 3, column 7}).FirstOrDefault(s => s.Id == myId); 
+0

Mikael, s s FirstOrDefault дает мне доступ к элементам, выбранным в анонимном элементе. Это не то, что мне нужно. спасибо за попытку, хотя – WPalombini

+0

Как я уже писал, вы используете первый, если вы не включаете Id в проекцию, а второй если вы это сделали –

+0

Да, извините, я снова прочитал ваш ответ, но это заставит меня выбрать Идентификатор, чтобы иметь возможность сравнить его позже. Не совсем то, что я хочу. – WPalombini

1

Я хотел бы создать еще один класс который содержит подмножество свойств, которые вы хотите. Таким образом, это всегда должно быть ясно, что вы работаете с:

public class EntityClassLite 
{ 
    public int Id {get; set;} 
    public string Column2 {get; set;} 
    public string Column3 {get; set;} 
    public string Column7 {get; set;} 
} 

Тогда вы могли бы иметь отдельный метод в вашем репозитории:

public EntityClassLite GetLiteById(int id) 
{ 
    return db.Set<EntityClass>() 
      .All 
      .Where(e => e.Id = id) 
      .Select(new EntityClassLite 
        { 
         Column2 = e.Column2 
         Column3 = e.Column3 
         Column7 = e.Column7 
        } 
      .FirstOrDefault() 
} 

Вы могли бы также подумать об использовании наследования:

public class EntityClass: EntityClassLite 
{ 
    public string Column1 {get; set;} 
    public string Column4 {get; set;} 
    public string Column5 {get; set;} 
    public string Column6 {get; set;} 
    public string Column8 {get; set;} 
    public string Column9 {get; set;} 
    public string Column10 {get; set;} 
} 

Тогда у вас будет два репозитория. Один для EntityClass и один для EntityClassLite, каждый со своим собственным методом Find и каждый возвращающий требуемые данные.

Как в стороне, мне очень трудно представить себе сущность, которая имеет такие большие столбцы, что выборка из одного экземпляра может вызвать значительные проблемы с производительностью.

1

Ну, я думаю, вам следует пересмотреть, используя репозиторий (если вы используете EF) и переместить ваши выборки логики внутри конкретного метода, как GetEmployeeById(int id) в службы слоя.

И вот цитата о том, что произойдет, если вы используете репозиторий вместе с Entity Framework.

Вы отказались от всех функций вашей технологии хранения данных, для мягкого, стерилизованного, неэффективного способа доступа к вашим данным. - Халид Abuhakmeh

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