[entity-framework] 지정된 형식 멤버 ‘Date’는 LINQ to Entities Exception에서 지원되지 않습니다.

다음 문을 구현하는 동안 예외가 발생했습니다.

 DateTime result;
 if (!DateTime.TryParse(rule.data, out result))
     return jobdescriptions;
 if (result < new DateTime(1754, 1, 1)) // sql can't handle dates before 1-1-1753
     return jobdescriptions;
 return jobdescriptions.Where(j => j.JobDeadline.Date == Convert.ToDateTime(rule.data).Date );

예외

The specified type member 'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.

예외의 의미는 알고 있지만 제거하는 방법을 모르겠습니다. 도움이 필요하세요?



답변

LINQ to Entities는 동등한 SQL이 없기 때문에 대부분의 .NET Date 메서드 (사용한 캐스팅 포함)를 SQL로 변환 할 수 없습니다.

해결책은 LINQ 문 외부에서 Date 메서드를 사용한 다음 값을 전달하는 것입니다. Convert.ToDateTime (rule.data) .Date가 오류를 일으키는 것처럼 보입니다.

DateTime 속성에 대한 호출 날짜도 SQL로 변환 할 수 없으므로 해결 방법은 정수일 뿐이므로 LINQ로 변환 할 수있는 .Year .Month 및 .Day 속성을 비교하는 것입니다.

var ruleDate = Convert.ToDateTime(rule.data).Date;
return jobdescriptions.Where(j => j.Deadline.Year == ruleDate.Year 
                       && j.Deadline.Month == ruleDate.Month 
                       && j.Deadline.Day == ruleDate.Day);


답변

EntityFunctionsTruncateTime 메서드를 사용 하여 속성을 SQL로 올바르게 변환 할 수 있습니다 .Date

using System.Data.Objects; // you need this namespace for EntityFunctions

// ...

DateTime ruleData = Convert.ToDateTime(rule.data).Date;
return jobdescriptions
    .Where(j => EntityFunctions.TruncateTime(j.JobDeadline) == ruleData);

업데이트 : EntityFunctions EF6에서 더 이상 사용되지 않음, 사용DbFunctions.TruncateTime


답변

EF6의 경우 대신 DbFunctions.TruncateTime (mydate)을 사용하십시오.


답변

ef6의 “EntityFunctions.TruncateTime”또는 “DbFunctions.TruncateTime”이 작동하지만 빅 데이터에서 일부 성능 문제가 있습니다.

가장 좋은 방법은 다음과 같이 행동하는 것입니다.

DateTime ruleDate = Convert.ToDateTime(rule.data);

DateTime  startDate = SearchDate.Date;

DateTime  endDate = SearchDate.Date.AddDay(1);

return jobdescriptions.Where(j.Deadline >= startDate 
                       && j.Deadline < endDate );

날짜의 일부를 사용하는 것보다 낫습니다. 큰 데이터에서 쿼리가 더 빠르게 실행되기 때문입니다.


답변

를 포함해야합니다 using System.Data.Entity;. 잘 작동합니다.ProjectTo<>

var ruleDate = rule.data.Date;
return jobdescriptions.Where(j => DbFunctions.TruncateTime(j.Deadline) == ruleDate);


답변

의미하는 바는 LINQ to SQL이 Date속성을 SQL 식으로 변환하는 방법을 모른다는 것 입니다. 이는 구조 의 Date속성이 DateTimeSQL에서 아날로그 가 없기 때문 입니다.


답변

그것은 나를 위해 일했습니다.

DateTime dt = DateTime.Now.Date;
var ord = db.Orders.Where
      (p => p.UserID == User && p.ValidityExpiry <= dt);

출처 : Asp.net 포럼