Эквивалент «SELECT NULL AS ColumnName» в Entity Framework - PullRequest
1 голос
/ 20 марта 2019

У меня есть сценарий, который требует вернуть некоторые значения столбца как NULL.

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

В качестве упрощенного примера, скажем, у меня есть таблица из 5 столбцов, которая называется dbo.Person

+------+---------+-----+------------------------------------------------------------------------+------------------------------------------------+
| Name | Surname | Age |                                 About                                  |                     Likes                      |
+------+---------+-----+------------------------------------------------------------------------+------------------------------------------------+
| Bob  | Doe     |  22 | Grew up in no-man's land. Very strong. Also known as Bobby             | Burgers, Taking care of fish, kissing dolphins |
| Jane | Doe     |  21 | Grew up on the space station. Supremely intelligent. Also known as Jay | Icecream, Pug named Star Freak, Petting lions  |
| John | Doe     |  25 | Grew up in a whale. Can sing in sonar. Also known as Unknown           | Krill, Box Jellyfish, snacking on sea weed.    |
+------+---------+-----+------------------------------------------------------------------------+------------------------------------------------+

У меня есть класс сущностей, связанный с таблицей выше

[Table("Person")]
public class Person
{
    public string Name {get; set}

    public string Surname {get; set;}

    public string Age {get; set;}

    public string About {get; set;}

    public string Likes {get; set;}
}

Я определил контекст, соответствующий базе данных: PeopleContext : DbContext

У меня есть public DbSet<Person> Person{ set; get;}, определенный в PeopleContext

Предположим, все остальное настроено и работает,

Без необходимости проецировать на другой объект, кроме Person, Как мне написать мой запрос Entity Framework, чтобы он был эквивалентен следующему?

SELECT
   Name,
   Surname,
   Age,
   NULL AS About,
   NULL AS Likes 
FROM dbo.Person

1 Ответ

0 голосов
/ 21 марта 2019

Это проблема ViewModel / Consumer, а не сущности.Сущность всегда должна отражать фактическое состояние данных или предполагаемое состояние данных.

Если вы намереваетесь убрать «About and Likes», то:

var person = context.People.Single(x => x.PersonId == personId);
person.About = null;
person.Likes = null;

Когда / если вы позвоните SaveChanges() в контексте эти предполагаемые изменения будут сохранены.Это опасный вариант, если вы не собираетесь сохранять изменения, потому что, хотя они могут работать сегодня, завтра может наступить день, когда кто-то введет требование сохранить что-либо в контексте.

Если вы хотите использоватьPerson, как будто у него нет значения About или Likes:

var personViewModel = context.People
    .Where(x => x.PersonId == personId)
    .Select(x => new PersonViewModel
    {
        Name = x.Name,
        Surname = x.Surname,
        Age = x.Age
    }).Single();

Модель представления может содержать значение About и Likes, которое по умолчанию равно #null, если необходимо.

В качестве альтернативы, если вы простоВы хотите использовать эти данные на месте, не забирая дополнительную информацию о человеке "О & любит", вы можете использовать анонимный тип:

var personDetails = context.People
    .Where(x => x.PersonId == personId)
    .Select(x => new 
    {
        x.Name,
        x.Surname,
        x.Age
    }).Single();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...