Direct Lake 自发布以来,一直是 OneLake 语义模型(Semantic Model)里性能与实时性兼顾的明星方案。但有一个缺口始终让分析师们挠头:想在模型里加一列派生字段,要么得回头改上游数据管道,要么就得把表切成 Import 或 DirectQuery 模式,绕一圈再回来。现在这个缺口终于补上了——Direct Lake 计算列(Calculated Columns)进入预览阶段。
这不仅仅是补了个功能。它意味着你可以在不改变表存储模式、不触碰上游数据的前提下,直接用 DAX(数据分析表达式)在语义模型里定义新列。对于国内大量使用 Fabric 和 Power BI 的团队来说,这直接省掉了数据工程侧的反复沟通和排期,把建模的主动权真正交还给了分析师。
为什么这个功能等了这么久
Direct Lake 的底层逻辑是直接查询 OneLake 中的 Delta 表,按需将数据加载进内存,从而同时获得接近 Import 模式的查询速度和接近实时(near real-time)的数据新鲜度。但正因为它“不落地”数据,派生列的计算一直是个难题。
过去,如果你的模型需要一个从已有字段推导出来的新列,只有两条路:要么把逻辑下沉到数据源(比如在数据仓库里先算好),要么把表改成其他存储模式。前者增加了上游负担,后者牺牲了 Direct Lake 的性能优势。计算列的出现,让 DAX 表达式可以直接在语义模型层完成推导,不再需要“为了一个字段换赛道”。
能解决哪些实际问题
从典型场景看,这个功能覆盖了日常建模中相当高频的需求:
- 派生值:比如从出生日期计算年龄,
Age = DATEDIFF( DimCustomer[BirthDate], TODAY(), YEAR ) - 字段拼接:把城市和地区拼成一个字段用于切片器,
Customer Location = DimCustomer[CityName] & ", " & DimCustomer[ContinentName] - 格式化日期:生成“年月”格式用于视觉对象分组,
Month Name = FORMAT( DimDate[FirstOfMonth], "mmmm", USERCULTURE() ) - 多语言报表:借助
USERCULTURE()让日期或文本随查看者语言自动切换 - 个性化内容:通过
USERPRINCIPALNAME()等函数,让不同登录用户看到不同的展示内容
前两个例子在无安全上下文差异时,所有用户拿到的值都一样。第三个例子则不同——它会根据报表查看者的语言环境动态调整,这在跨国企业或外企分支机构的本地化报表里非常实用。
用户上下文(User Context)是关键设计
这次新增的 Expression Context(表达式上下文) 属性,是理解 Direct Lake 计算列安全行为的核心。目前 Direct Lake 计算列只支持 User Context 模式,这意味着:
- 表达式在用户查询模型时才被评估
- 计算过程自动遵循行级安全性(RLS)和对象级安全性(OLS)
- 只要表达式不引用用户感知型 DAX 函数或受安全控制的列,通常所有用户得到的结果一致
这里有一个容易被忽视但极其重要的安全细节。假设模型中有一个受 OLS 保护的列 DimCustomer[Education],你基于它写了一个计算列:
Is Graduate = IF( DimCustomer[Education] = "Graduate Degree", "Yes", "No" )
在传统的 Import 模式标准上下文下,受限用户虽然看不到原始教育字段,但依然能通过这个派生列推断出“是否研究生毕业”的结论——安全保护形同虚设。而在 User Context 下,无论是 Import 还是 Direct Lake,受限用户直接看不到这个派生列,敏感值永远不会被间接暴露。
这正是 Direct Lake 计算列与普通计算列的本质区别:它不是静态的列,而是带着用户安全上下文动态求值的表达式。
使用边界与注意事项
虽然功能很香,但有两个限制需要提前知道:
不能用于关系键。 Direct Lake 计算列在查询时评估,不会物化存储,因此无法作为表间关系的关联键。如果需要关系键,请在 Delta 表里预先构建好。
不响应筛选上下文。 计算列对每一行返回固定值,不会随报表筛选器或切片器变化。如果结果需要随用户交互动态改变,应该用度量值(Measure)而不是计算列。
这两个边界其实和传统计算列的逻辑一致,只是 Direct Lake 的“不物化”特性让第一个限制更加刚性。
上手路径
现在就可以在 Web 建模或 Power BI Desktop 中打开一个 Direct Lake on OneLake 语义模型,直接创建计算列,用 DAX 开始建模。预览阶段的功能通常意味着后续可能会有行为调整,建议在非生产环境中先验证你的核心场景。
对于国内的数据团队来说,这个功能的实际价值在于:它让“快速迭代分析模型”这件事不再受制于数据工程排期。以前加一个字段可能要等数仓团队改 ETL,现在分析师自己动手,几分钟搞定。当然,如果你的计算逻辑涉及复杂的安全控制或需要跨表引用,还是需要仔细评估 User Context 下的行为是否符合预期。





