Как выбрать только некоторые поля из таблицы в EF - PullRequest
13 голосов
/ 09 сентября 2011

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

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

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

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

и я хочу получить только эти столбцы:

ID, FirstName, LastName

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

Ответы [ 2 ]

27 голосов
/ 09 сентября 2011

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

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();

посмотрите, что между ними только ONE разница в выражении labda вместо u => new {} мы используем u => new UserViewModel{}.Удачи.

0 голосов
/ 30 ноября 2017

Есть много способов сделать эту работу, но использование 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...