【问题标题】:Combine columns in entity framework into one column with the edmx designer使用 edmx 设计器将实体框架中的列合并为一列
【发布时间】:2012-09-27 00:16:44
【问题描述】:

我正在使用 EntityFramework 5 EDMX 设计器,并希望将人的名字和姓氏组合成实体上的单个字段值(例如姓名)。

我认为在以前的版本中有一种方法可以做到这一点,但我没有看到任何可用的东西来做我需要做的事情。

这还有可能吗?

【问题讨论】:

    标签: entity-framework-5 two-columns edmx-designer


    【解决方案1】:

    除非我不理解您的问题,否则我相信我已经使用类似于以下内容的部分类做到了这一点:

        public partial class person
        {
            public string name { 
                get
                {
                    return firstname + " " + lastname;
                }
                set{ }
            }
        }
    

    【讨论】:

      【解决方案2】:

      不,这是不可能的。您可以create model defined function 并在查询中使用它,但它仍然不是您实体的一部分。如果您的实体是只读的,您可以使用组合列创建数据库视图并将其映射而不是表 - 它还显示了将列组合成单个属性不是那么容易的主要原因。读取过程中的自动连接很容易,但自动分解以将正确的值保存到正确的列中很难并且容易出错。

      如果您需要组合属性而不是查询,您可以简单地创建实体类的另一个部分并添加您自己的计算属性。如果您需要组合属性进行查询,请使用模型定义的函数。

      【讨论】:

        【解决方案3】:

        我这样做的方式是通过Computed Column,如下所述:

        How to make a computed column nullable in SQL Server

        如果您使用计算列,您将能够在 LINQ 查询中使用这样的列。例如:

        var users = Database.Users.Where(u => u.FullName.ToLower().Contains("string"));
        

        您不会收到“LINQ to Entities 不支持”之类的错误,因为此属性实际上是模型对象的一部分。所有繁重的工作都发生在数据库端。

        当然,您可以将FullName 属性放在部分类中并使用它。

        public string FullName 
        {
            get { return string.Format("{0} {1}", FirstName, LastName); }
        }
        

        在这种情况下,您必须先调用 .ToList() ( Database.Users.ToList(); ) 才能在 LINQ 查询中使用此属性。 .ToList() 将使您的所有Users 水化/带入记忆。这是不可取的!


        您也可以尝试这里描述的FullName 属性实现:Calculated Columns in Entity Framework Code First Migrations

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-10-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-04
          • 2011-10-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多