开发者

big issue in converting string to datetime using linq-to-entities

开发者 https://www.devze.com 2023-04-12 06:52 出处:网络
How can I convert the string to datetime using linq to entities .... I have got the below query, where the visit_date column datatype is string...

How can I convert the string to datetime using linq to entities ....

I have got the below query, where the visit_date column datatype is string...

var memberl = from v in abc.visits
              join m in abc.members on v.member_Id equals m.member_Id
              where Convert.ToDateTime(v.visit_Date) >= startdate && 
                    Convert.ToDateTime(v.visit_Date) <= enddate
              group m by new { m.member_Firstname, 
                               m.member_Lastname, m.member_Id } into g
              orderby g.Count()
              select new
              {
                  numVisits = g.Count(),
                  firstname = g.Key.member_Firstname,
                  lastname = g.Key.member_Lastname
              };

Unfortunately I can't change the schema ...

I have got the error:

linq to entites does not recognise Convert.ToDatetime method

Is there any possible solution for converting string to Datetime?

Updated code:

as per request i Have updated my question

 var data = (from v in abc.visits
                  join m in abc.members on v.member_Id equals m.member_Id
                  select new
                  {
                      MemberID = v.member_Id,
                      VisiteDate = v.visit_Date,
                      FirstName = m.member_Firstname,
                      LastName = m.member_Lastname
                  }).ToList();

      var membersdata = from d in data
                        where Convert.ToDateTime(d.VisiteDate) >= startdate && Convert.ToDateTime(d.VisiteDate) <= enddate
                        group m by new { d.FirstName, d.LastName, d.MemberID } into g
                        orderby g.Count()
                        select new
                        {
                            numVisits = g.Count(),
          开发者_Python百科                  firstname = g.Key.FirstName,
                            lastname = g.Key.LastName
                        }; 


I don't think EF supports a translation for a String to DateTime or vice-versa conversion.

As I see it, you have two options, depending on the format of the date in the string field:

If the format is fairly simple, a string comparison might be enough:

// Convert the boundaries to strings first
// TODO: Set the ToString format option to match the database format
string startDateAsString = startdate.ToString("yyyyMMdd");
string endDateAsString = enddate.ToString("yyyyMMdd");

// Query based on string comparison
var memberl = from v in abc.visits
              join m in abc.members on v.member_Id equals m.member_Id
              where v.visit_Date.CompareTo(startDateAsString) >= 0 && 
                    v.visit_Date.CompareTo(endDateAsString) <= 0
              group m by new { m.member_Firstname, 
                               m.member_Lastname, m.member_Id } into g
              orderby g.Count()
              select new
              {
                  numVisits = g.Count(),
                  firstname = g.Key.member_Firstname,
                  lastname = g.Key.member_Lastname
              };

If the string representation of the date is more complex, and a simple string comparison cannot help, you might consider creating a view on the visits table, which does the conversion for you at database level:

CREATE VIEW VisitsWithDate (MemberId, VisitDate)
AS
SELECT MemberId, Convert(datetime, VisitDate, 112) -- For instance
FROM Visits

Followed by importing this view into your DataModel. You might need to do some magic to make the relationships work.

Hope it helps.


Convert.ToDatetime is supported by Linq2SQL. The only supported method of Linq to entities are these: http://msdn.microsoft.com/en-us/library/bb738681.aspx

about your problem ... try to convert startdate and enddate in string and compare the string value in linq expression.


Try converting the results to a List<> first, and filter the results from the list:

var data = (from v in abc.visits 
            join m in abc.members on v.member_Id equals m.member_Id
            select new
            {
                MemberID = v.member_id,
                VisiteDate = v.visit_date,
                FirstName = m.member_FirstName,
                LastName = m.member_LastName
            }).ToList();    


var memberl = from d in data    
              where Convert.ToDateTime(d.VisitDate) >= startdate && Convert.ToDateTime(d.VisitDate) <= enddate           
              group d by new { d.FirstName, d.LastName, d.MemberID } into g           
              orderby g.Count()           
              select new           
              {           
                  numVisits = g.Count(),           
                  firstname = g.Key.FirstName,           
                  lastname = g.Key.LastName           
              }; 


Because DateTime and DateTimeOffset are structs, they are not intrinsically nullable. When you need nullability, there are two ways around this:

  1. Use a Nullable type (i.e., DateTime? or DateTimeOffset?).
  2. Use the static field DateTime.MinValue or DateTimeOffset.MinValue (the default values for these types)
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号