如何将运行时计算的非持久只读属性正确添加到 LinqToSQL 数据类

发布于 2024-11-09 11:59:40 字数 245 浏览 0 评论 0原文

表中有一个 DateTime 字段,LinqToSQL 数据类中有一个映射属性。任务是添加一个布尔值 IsWorkingTime 运行时(不直接映射到任何列,而是在读取时计算)属性,该属性将说明 DateTime 是否是工作时间(日期部分既不是周末也不是假期,时间部分在上午 9 点之间)和下午 5 点)。该属性应该可用于 LINQ 查询,但不会影响数据库后台。

如何实现这一目标?我使用 Visual Studio 数据类设计器首先绘制模型,然后生成数据库。

There is a DateTime field in a table and a mapped property in LinqToSQL data class. The task is to add a boolean IsWorkingTime runtime (not mapped to any column directly but calculated on read) property which will say whether the DateTime is a working hour (the date part is neither a weekend nor a holiday and the time part is between 9am and 5pm). The property should be available for LINQ queries but not affecting the database background.

How to achieve that? I use Visual Studio data classes designer to draw the model first and generate the database then.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

一生独一 2024-11-16 11:59:40

至于添加属性,您可以利用附加的分部类定义将其添加到模型中。例如

//TheModel.cs
// file generated by tool
public partial class TheModel
{
    // ...
}

然后你的扩展

//TheModelCustom.cs
public partial class TheModel
{
     public bool IsWorkingTime
     {
          get
          {
               // your (hopefully inexpensive) logic
          }
     }
}

你会遇到麻烦的是希望使用 Linq 中的属性的部分。如果您想使用它构建对数据库的查询,您可能会不走运。提供者将无法将属性及其逻辑转换为适当的 SQL。但是,如果您可以通过数据库后过滤/投影/等来完成,则可以在返回数据后使用该属性。

 var results = (from model in db.TheModels 
               where /* some criteria */
               select model) // <-- the part of the query that goes to the DB
               .AsEnumerable()
               .Where(m => m.IsWorkingTime); // <-- happens in memory

As for adding the property, you can utilize an additional partial class definition to add it to the model. Such as

//TheModel.cs
// file generated by tool
public partial class TheModel
{
    // ...
}

And then your extension

//TheModelCustom.cs
public partial class TheModel
{
     public bool IsWorkingTime
     {
          get
          {
               // your (hopefully inexpensive) logic
          }
     }
}

Where you will run into trouble is the part about wishing to use the property in Linq. If you want to use it for constructing a query going to the database, you may be out of luck. The provider will not be able to translate the property and its logic to the appropriate SQL. However, if you can get by with post-DB filtering/projecting/etc., you can use the property once the data has been returned.

 var results = (from model in db.TheModels 
               where /* some criteria */
               select model) // <-- the part of the query that goes to the DB
               .AsEnumerable()
               .Where(m => m.IsWorkingTime); // <-- happens in memory
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文