Как выбрать только некоторые поля из таблицы в 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
.