繁体   English   中英

Linq to SQL datetime问题

[英]Linq to sql datetime issue

当我调用GetClosestStartDate时,它会弹出以下消息其他信息:

LINQ to Entities无法识别方法'System.String ToString()',并且该方法无法转换为商店表达式。 我还尝试了从“ TT.Startdate.Value.ToString()”中删除ToString并将“ string CStartdate {get; set;}更改为DateTime CStartdate {get; set;}”的尝试。

class Class_CourseStartdate
{
    public string CStartdate { get; set; }
    public int TimeTableID { get; set; }
}

   public List<Class_CourseStartdate> GetClosestStartDate(DateTime CoeStartdate)
   {
       return (from TT in _er.TimeTables
               where TT.Startdate == CoeStartdate
               select new Class_CourseStartdate 
               { CStartdate = TT.Startdate.Value.ToString() ,
                 TimeTableID = TT.TimeTableID 
               }
               ).ToList();
   }

最简单的方法是仅获取要转换为SQL的部分中所需的数据,然后在本地进行其余操作:

public List<Class_CourseStartdate> GetClosestStartDate(DateTime coeStartdate)
{
    return _er.TimeTables
              .Where(tt => tt.Startdate == coeStartdate)
              .Select(tt => new { tt.Startdate, tt.TimeTableID })
              .AsEnumerable() // Do the rest locally
              .Select(tt => new Class_CourseStartdate 
              { 
                   CStartdate = tt.Startdate.Value.ToString() ,
                   TimeTableID = tt.TimeTableID 
              }
              .ToList();
}

请注意,我在这里已停止使用查询表达式,因为当您需要在其上调用方法时它变得很丑陋-而您正在做的只是一个简单的Where and Select 当查询表达式涉及透明标识符时(例如在联接中),查询表达式最有用。

接下来,我会注意到我们已经在检查tt.Startdate是否等于传入的日期-那么为什么要麻烦提取它呢?

public List<Class_CourseStartdate> GetClosestStartDate(DateTime coeStartdate)
{
    return _er.TimeTables
              .Where(tt => tt.Startdate == coeStartdate)
              .Select(tt => tt.TimeTableID)
              .AsEnumerable() // Do the rest locally
              .Select(tid => new Class_CourseStartdate 
              { 
                   CStartdate = coeStartDate.ToString() ,
                   TimeTableID = tid
              }
              .ToList();
}

或可能只是更改方法以返回时间表ID,因为这确实在做。 我也会更改方法名称:

public List<int> GetTimeTableIdsForStartDate(DateTime coeStartdate)
{
    return _er.TimeTables
              .Where(tt => tt.Startdate == coeStartdate)
              .Select(tt => tt.TimeTableID)
              .ToList();
}

即使坚持Class_CourseStartdate我会改变CStartdate属性只是DateTime ,而不是string -避免使用串在你的模型,除非你真的不得不这样做。

此外,您的命名当前感觉到处都是Startdate到处都应该是StartDate ,应该删除CClass_前缀,等等。

试试这个:

return (from TT in _er.TimeTables
        where TT.Startdate == CoeStartdate
        select new  
        {
            CStartdate = TT.Startdate.Value.ToString() ,
            TimeTableID = TT.TimeTableID 
        }
        ).AsEnumerable()
         .Select(x=> new Class_CourseStartdate
         {
             CStartdate = x.CStartdate.Value.ToString(),
             TimeTableID = x.TimeTableID
         }).ToLIst();

这样,您可以从数据库中获取数据,然后应用所需的格式。

LINQ名称空间中未定义的大多数函数都不能在IQueryabe LINQ表达式内使用( ToString是其中之一)。 解决方案是仅照原样复制值并随后执行转换,或者将LINQ替换for循环以遍历值,在这种情况下,可以正确使用ToString

首先,那里可能存在异常: TT.StartDate可能为null,并且在调用Value时会获得异常。

其次,为什么CStartDate是一个字符串? 您将无法执行特定于DateTime操作,并且如果将字符串转换回DateTime是在具有不同区域性的线程上进行的,则可能会遇到问题。

作为快速解决方案,您可以在将数据加载到内存中后尝试向查询中添加第二个投影:

return _er.TimeTables
    .Where(tt => tt.Startdate == CoeStartdate)
    .Select(tt => new { StartDate = tt.StartDate, Id = tt.TimeTableID})
    .ToList()
    .Select(tt => new Class_CourseStartDate
    {
        // Avoid the exception by checking if property has value
        CStartDate = tt.StartDate.HasValue ? tt.StartDate.Value.ToString() : String.Empty,
        TimeTableId = tt.Id
    })
    .ToList();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM