C# 如果实体的(datetime2(7))日期字段+;(bigint)时间跨度字段为>;约会时间,现在

C# 如果实体的(datetime2(7))日期字段+;(bigint)时间跨度字段为>;约会时间,现在,c#,entity-framework,linq-to-entities,C#,Entity Framework,Linq To Entities,假设用户订阅了从某个时间点开始并持续一段时间的通知。因此,在我们的模型中,我们将有两个相关字段DateTime和TimeSpan。现在我们的DateTime字段将映射到DateTime(7),但是由于CLRTimeSpan与一些SQL类型之间没有直接映射,我们必须在模型中将TimeSpan存储为Int64,添加访问器和变异器,允许我们在代码中使用TimeSpan,并在数据库中存储为bigint public class CustomerMemebership { public Int

假设用户订阅了从某个时间点开始并持续一段时间的通知。因此,在我们的模型中,我们将有两个相关字段
DateTime
TimeSpan
。现在我们的
DateTime
字段将映射到
DateTime(7)
,但是由于
CLR
TimeSpan
与一些
SQL类型之间没有直接映射,我们必须在模型中将
TimeSpan
存储为
Int64
,添加访问器和变异器,允许我们在代码中使用
TimeSpan
,并在数据库中存储为
bigint

public class CustomerMemebership
{
    public Int      CustomerId    { get; set; }
    public DateTime EffectiveDate { get; set; }
    public Int64    timeSpan      { get; set; }
    public TimeSpan TimeSpan
    {
        get { return TimeSpan.FromTicks(timeSpan); }
        set { timeSpan = value.Ticks; }
    }
}

db.CustomerMemberships.Where(cm => DateTime.UtcNow < DbFunctions.AddNanoseconds(cm.EffectiveDate, cm.timeSpan * 100))
public class customermebership
{
public Int CustomerId{get;set;}
public DateTime EffectiveDate{get;set;}
公共Int64 timeSpan{get;set;}
公共时间跨度时间跨度
{
获取{return TimeSpan.FromTicks(TimeSpan);}
设置{timeSpan=value.Ticks;}
}
}
其中(cm=>DateTime.UtcNow

映射到
SQL-Time
是不可能的,因为
Time
是5个字节,
TimeSpan
是8个字节。如何获取具有活动订阅的实体
DbFunctions.AddNanoseconds
只接受
int32
,因为它映射到
SQL DATEADD
,后者也只能处理32位整数。或者可能是我做错了?

这只是一个建议,你可以改变你的模型。您有
EffectiveDate
TimeSpan
。您需要订阅的结束时间,因此您可以计算结束时间并保存它,而不是
TimeSpan
(任何格式)。然后你可以很容易地提取它

拥有两个不同类型的公共属性,它们的名称相同,但仅在第一个字母的大小写上有所不同,这很可能会让您的类型的使用者感到困惑。考虑将“TimeSIPN”重命名为“TimePANNICTICK”或诸如此类的东西。这只是一个有用的建议,来自那些花太多时间阅读别人文章的人code@JayV恐怕你问过了,因为我问的是不能翻译日期时间的
EF
LINQ to Entities
。将(TimeSpan)
添加到SQL中…@Flydog57,首先它有很好的文档记录,其次,其中一个是属性,另一个是字段,此外,它不会暴露给不知情的程序员,因此不会有人感到困惑,但感谢您的洞察力。感谢您的洞察力,虽然这在我的特定情况下无法实现,因为实际模型比我提供的示例复杂得多。。。因为它可能对谷歌用户有用,所以我把它标记为有用的答案。