Как выбрать только некоторые поля из таблицы в EF

У меня есть таблица с 9 столбцами в базе данных, и я хочу иметь возможность загружать только некоторые поля, если нужно.

Как я могу это сделать с Entity Framework 4, пожалуйста?

например. Моя таблица имеет следующие поля:

ID, FirstName, LastName, FotherName, BirthDate, Mobile, Email

и я хочу иметь возможность извлекать только эти столбцы:

ID, FirstName, LastName

Мой проект - это приложение ASP.NET MVC 3, с SQLServer 2008 Express и EF 4.1.

Ответ 1

Предположим, что у вас есть таблица с этой моделью:

public class User{
    public int ID {get; set;}
    public string NickName {get; set;}
    public string FirstName {get; set;}
    public string LastName {get; set;}
    public string FotherName {get; set;}
    public DateTime BirthDate {get; set;}
    public string Mobile {get; set;}
    public string Email {get; set;}
    public string Password {get; set;}
}

Теперь вы хотите получить только ID, FirstName, LastName и FotherName. Вы можете сделать это двумя способами; Первый способ - получить их как объект anonymous, посмотрите:

var user = entityContext.Users.Where(u => u.ID == id)
    .Select(u => new {
        ID = u.ID,
        FirstName = u.FirstName,
        LastName = u.LastName,
        FotherName = u.FotherName
    }).Single();

Теперь ваш тип возвращаемого значения anonymous, вы можете работать с ним, например:

var i = user.ID;
// or
var s = user.FirstName;

Другим способом (например, если вы хотите передать объект как Модель в Вид), вы можете определить новый класс (т.е. UserViewModel), и когда вы выбираете объект, выберите его как UserViewModel. смотрите:

public class UserViewModel{
    public int ID {get; set;}
    public string NickName {get; set;}
    public string FirstName {get; set;}
    public string LastName {get; set;}
    public string FotherName {get; set;}
}

и в запросе, сделайте следующее:

var user = entityContext.Users.Where(u => u.ID == id)
    .Select(u => new UserViewModel {
        ID = u.ID,
        FirstName = u.FirstName,
        LastName = u.LastName,
        FotherName = u.FotherName
    }).Single();

Посмотрите, что между ними есть выражение ОДИН, в выражении labda вместо u => new {} мы используем u => new UserViewModel{}. Удачи.

Ответ 2

Существует много способов сделать это задание, но с помощью Automapper пакет NuGet является самым простым из тех, что я испытал.

  • Первый: установите Autmapper пакет NuGet для вашего проекта из проводника пакетов NuGet.
  • Второй. Создайте простой ViewModel, который содержит только необходимые атрибуты:

    public class UserViewModel {
        public int ID {get; set;}
        public string FirstName {get; set;}
        public string LastName {get; set;}
    }
    
  • Третий. Инициализируйте свой картограф только один раз в классе app_start, например:

    namespace SampleProject.App_Start {
        public class AutoMapperConfig {
            public static void Initializer() {
                AutoMapper.Mapper.Initialize(cfg => {
    
                    cfg.CreateMap<User, UserViewModel>()
                });
             }
         }
    }
    
  • Четвертый: добавьте его в Global.asax.cs:

    namespace SampleProject
    {
        public class MvcApplication : System.Web.HttpApplication
        {
            protected void Application_Start()
            {
                AreaRegistration.RegisterAllAreas();
                GlobalConfiguration.Configure(WebApiConfig.Register);
                FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
                RouteConfig.RegisterRoutes(RouteTable.Routes);
                BundleConfig.RegisterBundles(BundleTable.Bundles);
    
                // AutoMapper Initializer
                App_Start.AutoMapperConfig.Initializer();
            }
        }
    }
    
  • Пятый. Используйте его в своем контроллере, где вы хотите:

    namespace SampleProject.Controllers
    {
        public class UsersController : Controller
        {
            private DataContext db = new DataContext();
    
            public ActionResult Index()(
                var model = AutoMapper.Mapper.Map<List<UserViewModel>>(db.User.ToList());
                return View(model);
    
            }
        }
    }
    
  • Последняя. Вы можете создать столько карт, сколько хотите, между Models и ViewModels, инициализируя их один раз в классе app_start AutoMapperConfig и использовать их там, где вы хотите с простой строкой кода.

Также вы можете найти большую помощь по Automapper, если будете искать ее. Его главный сайт здесь.




Важно:

Я разработчик ASP.NET MVC 5. Automapper работает отлично для меня каждый раз. Я не могу проверить его на MVC 3 или старше MVC 5.