在 LINQ to SQL 中,DBML 设计器会为每张表生成一个实体类。当数据库表结构发生变化(比如新增了 bz 备注字段),但现有代码使用的 DBML 类不想改动时,可以为同一张表新建第二个 DBML 类,两个类映射到同一张物理表,字段集合不同。
操作方式
- 在 DBML 设计器中新建一个实体类(如
Money1) - 将其
Table特性映射到同一张表[dbo].[Money] - 只添加需要的字段(如
name、bz),不需要的字段不映射
// 旧代码不受影响,继续使用原来的 Money 类
using (var db = new DataClasses1DataContext())
{
var q = from m in db.Money
group m by new { m.name, m.bh } into g
select new
{
g.Key.name,
g.Key.bh,
je = g.Sum(r => r.je),
ssje = g.Sum(r => r.lx == 1 ? r.je : 0),
tfje = g.Sum(r => r.lx == 2 ? r.je : 0),
ylje = g.Sum(r => r.lx == 1 ? r.je : 0) - g.Sum(r => r.lx == 2 ? r.je : 0)
};
var list = q.ToList();
// 新需求:需要用到 bz 字段,使用 Money1 类
var q1 = from m in db.Money1
select new { m.name, m.bz };
var list2 = q1.ToList();
}Code language: JavaScript (javascript)
原理
| 项目 | 说明 |
|---|---|
| 映射机制 | LINQ to SQL 通过 [Table(Name="dbo.Money")] 特性绑定实体类与物理表 |
| 字段匹配 | 只映射类中声明的属性,表中多余的字段被忽略 |
| 查询生成 | SELECT 只查映射的字段,不查未声明的列 |
| 互不影响 | 两个类独立存在,修改一个不影响另一个 |
生成的 SQL 对比
Money 类(无 bz):
SELECT [t0].[name], [t0].[bh], SUM([t0].[je]) AS [value], ...
FROM [dbo].[Money] AS [t0]
GROUP BY [t0].[name], [t0].[bh]Code language: CSS (css)
Money1 类(有 bz):
SELECT [t0].[name], [t0].[bz]
FROM [dbo].[Money] AS [t0]Code language: CSS (css)
同一个物理表,不同实体类生成不同的
SELECT列。
Previous: 字符串范围比较(CompareTo)
Next: 动态拼接查询(IQueryable 延迟执行)