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

目录
相关文章
|
7月前
|
SQL 开发框架 .NET
C# Linq SaveChanges()报错 You have an error in your SQL syntex
C# Linq SaveChanges()报错 You have an error in your SQL syntex
29 0
|
SQL 开发框架 .NET
SQL中in和not in在LINQ中的写法
SQL中in和not in在LINQ中的写法
|
SQL 开发框架 .NET
ef linq方式插入+sql操作数据注意事项
ef linq方式插入+sql操作数据注意事项
93 0
|
SQL 存储 开发框架
Linq To SQl总结
Linq To SQl总结
180 0
Linq To SQl总结
|
SQL .NET 开发框架
Linq SQL 动态个数where查询
Linq SQL 动态个数where查询,从parts表中查找工件类型ID为1、2或6...(个数不定)的所有part。
8452 0
|
3月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
5月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
118 13
|
5月前
|
SQL
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。