Linq to SQL中的ColumnAttribute中的Expression

简介: 在Linq to SQL中,使用ColumnAttribute特性来关联数据库和实体类。这个Atrribute也有很多属性可以设置。其中让人比较迷糊的是Expression,也折磨了我好几天才弄明白(因为官方的例子给的也让人迷糊,基本运行都无法通过)。

微软现在虽然主推EF(Entity Framework)了,但也提供了Linq to EF的实现,Linq在微软的框架中还是一个比较强大的实现。曾经的Linq to SQL由于仅提供了SQL Server的OR实现,受到广大的诟病。后来开源社区也提供了Linq to XXX,来支持各种数据的Linq实现。
今天讨论的是ColumnAttribute中的Expression属性,开始我创建好表,在某一个列的ColumnAttribute中添加Expression,让它在原有值上加1,发现最终的结果并没有实现值加1。
通过仔细查看官方文档,发现Expression属性仅在创建数据库时生效,也就是说这个属性会创建一个新的计算列,如果按照官方的例子,在UnitPrice上执行加1是不能成功的,这相当于有一个例是UnitPrice,还要创建一个计算列是UnitPrice+1,列名还为UnitPrice。这就违反数据库创建表的列名必须唯一的原则。
所以真正有效的例子如下:

        [global::System.Data.Linq.Mapping.ColumnAttribute(Storage = "_UnitPrice", DbType = "Money")]
        public System.Nullable<decimal> UnitPrice
        {
            get
            {
                return this._UnitPrice;
            }
            set
            {
                if ((this._UnitPrice != value))
                {
                    this.OnUnitPriceChanging(value);
                    this.SendPropertyChanging();
                    this._UnitPrice = value;
                    this.SendPropertyChanged("UnitPrice");
                    this.OnUnitPriceChanged();
                }
            }
        }
        [Column(Storage = "_NewUnitPrice", DbType = "Money", Expression = "UnitPrice + 2.00")]
        public decimal? NewUnitPrice
        {
            get { return _NewUnitPrice; }
            set { _NewUnitPrice = value; }
        }

其中的NewUnitPrice是我们要创建的新单价的计算列。然后在使用时如果数据库存在先删除,再创建,代码如下:

ProductClassDataContext pcdc = new ProductClassDataContext(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=D:\demo.mdf;Integrated Security=True;Connect Timeout=30");
            if (pcdc.DatabaseExists())
            {
                pcdc.DeleteDatabase();
            }
            pcdc.CreateDatabase();

当然删除操作完善点应该是在首次运行时。否则每次都删除的话原来的数据都没有了。
当创建好数据库后,使用VS查看表,发现NewUnitPrice的图标都是计算列图标。如下图:
2020-03-18_102050.png

目录
相关文章
|
2月前
|
SQL 开发框架 .NET
C# Linq SaveChanges()报错 You have an error in your SQL syntex
C# Linq SaveChanges()报错 You have an error in your SQL syntex
10 0
|
7月前
|
SQL 开发框架 .NET
SQL中in和not in在LINQ中的写法
SQL中in和not in在LINQ中的写法
|
8月前
|
SQL 开发框架 .NET
ef linq方式插入+sql操作数据注意事项
ef linq方式插入+sql操作数据注意事项
65 0
|
SQL 存储 开发框架
Linq To SQl总结
Linq To SQl总结
150 0
Linq To SQl总结
|
SQL .NET 开发框架
Linq SQL 动态个数where查询
Linq SQL 动态个数where查询,从parts表中查找工件类型ID为1、2或6...(个数不定)的所有part。
8406 0
|
15天前
|
SQL 人工智能 算法
【SQL server】玩转SQL server数据库:第二章 关系数据库
【SQL server】玩转SQL server数据库:第二章 关系数据库
52 10
|
1月前
|
SQL 数据库 数据安全/隐私保护
Sql Server数据库Sa密码如何修改
Sql Server数据库Sa密码如何修改
|
25天前
|
SQL
启动mysq异常The server quit without updating PID file [FAILED]sql/data/***.pi根本解决方案
启动mysq异常The server quit without updating PID file [FAILED]sql/data/***.pi根本解决方案
17 0
|
15天前
|
SQL 算法 数据库
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
88 6