none
wcf ria service 服务端自定义查询中DateTime比较的问题 RRS feed

  • 问题

  • 在客户端没问题如下    

     foreach (var my in myDataBase.TRecords.Where(p => DateTime.Parse(p.Time.Trim()) < DateTime.Parse("2008-10-22 17:41:33 ")))

    在服务端中同样的代码 return this.ObjectContext.TRecord.Where(p => DateTime.Parse(p.Time.Trim()) < DateTime.Parse("2008-10-22 17:41:33 ")))却无法返回正确的结果,从通讯效率角度上应该是服务端做自定义查询之后,在把结果丢给客户端的做法比较好,可是服务端的linq使用DateTime格式进行比较好像会出错,请问怎么解决呢?

    2010年4月15日 8:26

答案

  • 这段: Where(p => DateTime.Parse(p.Time.Trim())...  是要发到SQL Server去执行的, EntityFramework并不支持所有CLR method 到SQL method的转换.

    如果你不关心performance,可以这样:

    return this.ObjectContext.TRecord.ToList().Where(p => DateTime.Parse(p.Time.Trim()) < DateTime.Parse("2008-10-22 17:41:33 ")))

    ToList()会把前面部分在数据库里执行,后面的在Memory里执行。

    2010年4月16日 6:57

全部回复

  • SELECT   dbo.HRM_Person.PersonId, dbo.HRM_Person.Name AS 姓名, dbo.HRM_Person.IdCard AS 身份证,
                    dbo.HRM_Person.Sex AS 性别, dbo.HRM_Person.BirthDate AS 出生日期, dbo.HRM_Nation.NationName AS 民族,
                    dbo.HRM_Additional.ResidenceType AS 户口性质, dbo.HRM_Organization.FastCode,
                    dbo.HRM_Organization.OrganizationName AS 机构, dbo.HRM_Post.PostName AS 岗位名称,
                    dbo.HRM_PostSort.PostSortId, dbo.HRM_PostSort.PostSortName AS 岗位分类, dbo.HRM_PostSeries.PostSeriesId,
                    dbo.HRM_PostSeries.PostSeriesName AS 岗位系列, dbo.HRM_EmploymentForm.EmploymentFormName AS 用工形式,
                    dbo.HRM_Insure.Insurance AS 险种, dbo.HRM_Person.BehiredDate AS 拟录用日期,
                    dbo.HRM_Education.EducationName AS 学历, dbo.HRM_State.StateName AS 状态, dbo.HRM_State.StateId,
                    dbo.HRM_Organization.OrganizationId, dbo.HRM_Post.PostId, dbo.HRM_EmploymentForm.EmploymentFormId,
                    dbo.HRM_Study.SchoolGraduated AS 毕业院校, dbo.HRM_Contact.Mobile AS 手机,
                    dbo.HRM_Professional.ProfessionalName AS 所学专业, dbo.HRM_Professional.ProfessionalId,
                    dbo.HRM_Nation.NationId, dbo.HRM_Education.EducationId
    FROM      dbo.HRM_Insure RIGHT OUTER JOIN
                    dbo.HRM_Person LEFT OUTER JOIN
                    dbo.HRM_Organization INNER JOIN
                    dbo.HRM_PostSort INNER JOIN
                    dbo.HRM_Post INNER JOIN
                    dbo.HRM_Work ON dbo.HRM_Post.PostId = dbo.HRM_Work.PostId ON
                    dbo.HRM_PostSort.PostSortId = dbo.HRM_Post.PostSortId INNER JOIN
                    dbo.HRM_PostSeries ON dbo.HRM_PostSort.PostSeriesId = dbo.HRM_PostSeries.PostSeriesId ON
                    dbo.HRM_Organization.OrganizationId = dbo.HRM_Work.OrganizationId INNER JOIN
                    dbo.HRM_EmploymentForm ON
                    dbo.HRM_Work.EmploymentFormId = dbo.HRM_EmploymentForm.EmploymentFormId ON
                    dbo.HRM_Person.PersonId = dbo.HRM_Work.PersonId LEFT OUTER JOIN
                    dbo.HRM_Additional INNER JOIN
                    dbo.HRM_Nation ON dbo.HRM_Additional.NationId = dbo.HRM_Nation.NationId ON
                    dbo.HRM_Person.PersonId = dbo.HRM_Additional.PersonId ON
                    dbo.HRM_Insure.PersonId = dbo.HRM_Person.PersonId LEFT OUTER JOIN
                    dbo.HRM_Contact ON dbo.HRM_Person.PersonId = dbo.HRM_Contact.PersonId LEFT OUTER JOIN
                    dbo.HRM_State INNER JOIN
                    dbo.HRM_StateSeries ON dbo.HRM_State.StateSeriesId = dbo.HRM_StateSeries.StateSeriesId ON
                    dbo.HRM_Person.StateId = dbo.HRM_State.StateId LEFT OUTER JOIN
                    dbo.HRM_Education INNER JOIN
                    dbo.HRM_Study ON dbo.HRM_Education.EducationId = dbo.HRM_Study.EducationId LEFT OUTER JOIN
                    dbo.HRM_Professional ON dbo.HRM_Study.ProfessionalId = dbo.HRM_Professional.ProfessionalId ON
                    dbo.HRM_Person.PersonId = dbo.HRM_Study.PersonId

         以上是视图代码。

    用实体类框架生成的视图,然后生成ria service,更新数据后,检索视图没有变化,但是数据库已经修改了,重新进入后视图更新。

    这个到底怎么回事???

    2010年4月15日 8:20
  • 请吧具体的错误信息描述下或是将异常信息发出来,这样偏于帮助你分析问题。
    BLOG:http://beniao.cnblogs.com MSN:beniao@live.cn
    2010年4月16日 2:52
  • 你为什么要用string来存储DateTime呢? 既然是时间,最好在database中就是时间格式,这样DateTime.Parse(p.Time.Trim())  就可以省了. 因为这种clr函数数据库是不一定能识别的.

     DateTime.Parse("2008-10-22 17:41:33 ") 是个变量, 应该没问题,

    另外DateTime.Parse要慎用,因为如果当前Thread的Culture如果是其他语言的,这个Parse产生的结果会是不一样的.最好指定CultureInfo.

    2010年4月16日 4:35
  • 我现在开发的东西是建立在原有产品的基础上的,因此数据库没办法重新设计。如果要对string做时间格式的查询要怎么办呢?我的意思是为什么

    return this.ObjectContext.TRecord.Where(p => DateTime.Parse(p.Time.Trim()) < DateTime.Parse("2008-10-22 17:41:33 ")))会出错呢?

    2010年4月16日 6:43
  • 这段: Where(p => DateTime.Parse(p.Time.Trim())...  是要发到SQL Server去执行的, EntityFramework并不支持所有CLR method 到SQL method的转换.

    如果你不关心performance,可以这样:

    return this.ObjectContext.TRecord.ToList().Where(p => DateTime.Parse(p.Time.Trim()) < DateTime.Parse("2008-10-22 17:41:33 ")))

    ToList()会把前面部分在数据库里执行,后面的在Memory里执行。

    2010年4月16日 6:57
  • 你这样说我就明白了,我本来不打算用DateTime进行比较的,因为在SQL Server中的做法是直接varcha类型的直接进行比较就可以了,类似SqlServer中

    time<'2008-10-22 17:41:33',这种做法可以用linq做吗?

    2010年4月16日 7:39
  • 你好,

         Linq里比较DateTime可以这样

        var q =
           
    from e in db.Employees
           
    where e.HireDate >= new DateTime(1994, 1, 1)
           
    select e;
       

       也可以像Xu Sun提到的那样用DateTime.Parse转成时间

    2010年4月21日 0:54