kitlau
kitlau

kitlau's blog

All Posts


EF Core 动态构建表达式树简化 DDD 值对象的比较

这篇文章主要介绍了如何通过构建动态表达式树来生成复杂的SQL查询语句。作者详细讲解了使用`ValueObjectEqualHelper`方法的实现细节,包括如何处理原始类型和非原始类型的相等比较,以及如何将多个属性条件组合成一个逻辑与(AndAlso)的表达式树。最终生成的SQL语句正确,并且能够准确返回预期的结果。文章还提供了相关的代码示例和注释,帮助读者更好地理解动态表达式树的构建过程,并建议进一步阅读作者之前关于C#表达式树的文章以加深理解。--DeepSeek

.NET C# EF Core expression trees Entity Framework Core Dynamic Condition Generation

EF Core 动态构建表达式树为所有实体设置软删除的查询过滤器

作者通过使用Entity Framework Core的查询过滤功能和动态生成的表达式树,成功地为每个实体类自动生成了SoftDelete标记的过滤条件,从而避免了手动重复编写代码。这种方法不仅减少了代码冗余,还提高了项目的可维护性和扩展性,并且可以通过调用IgnoreQueryFilters方法来禁用自动过滤以获取所有数据。--DeepSeek

.NET EF Core lambda expressions Entity Framework Core Dynamic Expression Trees Soft Delete

手把手构建 C# 表达式树

这篇文章详细介绍了如何手动构建一个表达式树以筛选年龄大于18岁的人,包括创建参数、成员访问、比较运算符以及最终的Lambda表达式。作者展示了如何使用这个表达式在代码中过滤列表,并通过控制台输出结果。文章还讨论了手动编译表达式的必要性,提到如果使用`IQueryable`则不需要此步骤,并预告了两篇关于将表达式树应用于EF Core的文章,分别涉及动态构建表达式树来简化值对象比较和为实体类属性设置过滤器,而无需在每个配置中手动设置。--DeepSeek

.NET C# EF Core expression trees Dynamic Expression Linq Expressions

如何使用 CSharp 表达式树?

这篇文章介绍了如何手动构建C#表达式树以解决硬编码问题,并通过一个示例详细讲解了如何创建参数节点、成员访问节点以及组合成Lambda表达式的过程。文章还提到了表达式树在领域驱动设计中的潜在应用,但指出动态构建表达式树的代码可能较难理解,因此建议仅在必要时使用。最后,作者提供了相关的官方文档链接以供进一步学习。--DeepSeek

C# Functional Programming lambda expressions expression trees Dynamic Code Generation Property Access

【译】数据是如何存储在 SQL 数据库中

本文探讨了 SQL 数据库中数据的存储机制,重点解释了数据页、B-树和聚集索引结构等关键概念。文章指出,尽管数据库的逻辑结构看似简单,但其物理存储方式决定了性能优化的可能性。通过详细分析 B-树的层级结构和指针系统,本文揭示了 SQL Server 如何高效定位数据行,以及这些底层机制对查询性能的影响。深入理解这些内容,不仅可以帮助我们更好地设计数据库,还能让我们在遇到性能问题时找到解决方案。那么,你是否已经开始思考如何根据这些知识优化自己的数据库设计了呢?--DeepSeek

DB Data Storage B Tree Clustered Index Data Page Root Node

【译】SQL 索引是如何工作的

这篇文章详细介绍了数据库中的聚集索引和非聚集索引的原理及其工作方式,通过实际操作和执行计划对比了有无索引时的成本差异。文章指出,聚集索引存储表中的所有行数据,并且作为主键自动创建;而非聚集索引则只存储指向聚集索引的指针和相关列值,用于快速定位数据。查询优化器会根据索引类型选择最优执行计划以减少IO操作。通过非聚集索引的Index Seek和Key Lookup过程,可以高效地实现基于非聚集索引的查询,并最终通过嵌套循环将结果集组合起来。文章还对比了有无非聚集索引时的Estimated Subtree Cost差异,强调了索引对性能优化的重要性。--DeepSeek

DB Clustered Index Database Index Non Clustered Index Execution Plan Query Optimization

如何在 CSharp 和 EF Core 中使用 UTC 时间

本文介绍了一位开发者为解决外贸网站时区问题而采用UTC时间处理的方法。通过定义Product实体类并将时间字段存储为UTC,在EF Core中配置模型确保数据库存储UTC时间,并使用Mapster将UTC时间转换为美国当地时间展示给用户,避免了因时区差异导致的时间显示错误。文章详细讲解了UTC时间的概念、C#中的操作方法、EF Core的配置扩展以及Mapster工具的应用,最终实现了前台网站正确显示当地时的功能,确保产品信息准确无误。--DeepSeek

.NET C# EF Core utc time mapster time zones

解锁 AI 的黑暗面:与无约束的 AI 模型交谈

世界进入了LLM(大规模语言模型)时代,但随之而来的问题逐渐显现。例如,GPT-3.5和GPT-4虽然功能强大,却并非真正开放,不仅无法被所有人公平使用,还引发了对数据安全的担忧。三星员工将机密数据发送给ChatGPT的事件更是让人们意识到闭源模型的风险,许多公司开始禁止员工使用这些工具。开源LLM成为一种"可控"的替代方案,既能避免数据泄露,又能打破大公司的垄断。然而,微软的Semantic Kernel等集成工具仅支持OpenAI或Azure OpenAI服务,限制了开发者的自由选择。作者认为开源LLM是未来的希望,期待它们能够超越GPT-4,为世界带来公平与安全的选择。对于"无约束AI"的需求,作者表示理解,认为被大公司垄断并提供受控内容的模式同样令人担忧,人们有权了解这些知识以避免受限。--DeepSeek

AI Open Source LLM Closed source Models Data Security AI Deployment Technical Fairness

如何实现 AI 虚拟小镇?我与 NewBing 和 GPT-4 讨论了一下

基于Phaser游戏引擎和FAISS向量数据库实现RPG游戏的方法包括:通过`update`方法调用`makeDecision`更新NPC决策,并在`interactWithEnvironment`中处理与环境元素(如床、书架)的交互。此外,在`communicateWithOtherNPC`中检测两个NPC之间的距离,若小于阈值则触发对话逻辑。主循环遍历所有NPC,依次执行决策更新、环境互动和与其他NPC交流。建议将游戏逻辑模块化,例如为不同环境元素创建单独类,并使用Phaser功能实现UI、音效等其他游戏元素,以完善RPG体验。--DeepSeek

AI Phaser.js FAISS RPG Game NPC Logic Environment Interaction

C# 3 年前的 record 你现在用上了吗?

这篇文章探讨了C#中的`record`类型及其在提高代码质量和安全性方面的重要性。文章指出,`record`类型的不可变性和值语义使其成为表示数据的理想选择,并能够减少多线程环境下的竞争条件和错误修改的风险。此外,通过使用`IReadOnlyCollection<T>`等只读集合类型,可以进一步确保数据的稳定性,从而提高代码的安全性、可预测性和可维护性。然而,文章也反思了当前软件开发中对代码质量的忽视现象,特别是在追求快速迭代和交付的过程中,一些开发者更倾向于采用快速但不稳定的解决方案,导致代码质量和维护成本的问题。作者呼吁重视代码质量,并利用像`record`这样的特性来提升软件的整体质量。--DeepSeek

.NET C# Record Immutability Value Semantics Data Modeling