【问题标题】:Equivalent to "SELECT NULL AS ColumnName" in Entity Framework相当于实体框架中的“SELECT NULL AS ColumnName”
【发布时间】:2019-08-11 09:08:41
【问题描述】:

我有一个场景需要将某些列值返回为 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

我在PeopleContext 中定义了public DbSet<Person> Person{ set; get;}

假设一切都已设置并正常工作,

无需投影到 Person 以外的其他对象,如何编写我的实体框架查询以等效于以下内容?

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

【问题讨论】:

  • 你可以使用 LINQ 将 Person 属性设置为 null 吗?
  • 可能是peopleContext.Person.Select(x=>new Person(){Name=x.Name,Surname=x.Surname,Age=x.Age,About=null,Likes=null});?
  • 如果你想对表的所有查询实现这一点,并且你想忽略两个属性的值与你的表同步,你可以将 [NotMapped] 属性添加到这两个属性。如果您只希望这个查询用于一个查询,那么您唯一的选择是编写自定义投影,可以是 @Magnetron 建议的同一类,也可以是自定义类。
  • c# 将接受空字符串,因此您无需执行任何操作。

标签: c# entity-framework linq tsql


【解决方案1】:

这是一个 ViewModel/Consumer 问题,而不是实体问题。实体应始终反映实际数据状态或预期数据状态。

如果您打算清除 About 和 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();

如果需要,视图模型可以包含默认为 #null 的 About 和 Likes 值。

或者,如果您只想在现场使用该数据而不撤回该人的 About & Likes 的额外细节,您可以使用匿名类型:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-09
    • 2023-01-11
    • 2022-01-22
    相关资源
    最近更新 更多