복붙노트

[SQL] 엔티티 프레임 워크와 타임 스탬프 열을 기준으로 선택의 새로운 기록

SQL

엔티티 프레임 워크와 타임 스탬프 열을 기준으로 선택의 새로운 기록

나는 SQL Server 데이터베이스에 타임 스탬프 열 (RowId가)있는 테이블을 가지고있다.

나는이 타임 스탬프에 따라 쿼리 새 행합니다. SQL 쿼리는 다음입니다

SELECT *
 FROM [MyTable]
 where RowId>=0x0000000000A99B06

0x0000000000A99B06는 이전 쿼리에서 최대 타임 스탬프 값입니다.

어떻게 엔티티 프레임 워크는 데이터베이스 처음 사용하여 이러한 쿼리를 만들 수 있습니까? 의 RowId 바이트 [] 속성에 매핑하고 내가 LINQ 쿼리에 바이트 배열을 비교하는 방법을 모른다.

해결법

  1. ==============================

    1.이 타임 스탬프 비교에서> = 연산자를 허용하지 않기 때문에 당신은 엔티티 프레임 워크와 함께이 작업을 수행 할 수 없습니다. 그것은 단지 = 수 있습니다. 당신은 예를 들어, 할 수있는

    이 타임 스탬프 비교에서> = 연산자를 허용하지 않기 때문에 당신은 엔티티 프레임 워크와 함께이 작업을 수행 할 수 없습니다. 그것은 단지 = 수 있습니다. 당신은 예를 들어, 할 수있는

    var b = BitConverter.GetBytes(1000000L);
    var query = from x in MyTable
                where x.RowId = b; // not >=
    

    그러나 그것은 매우 유용하지 않을 것입니다. 당신은, 예를 들어, 새 행을 얻기 위해 다른 방법을 찾아야 그래서 ID 열에서의 값은 또는 "실제"타임 스탬프 (날짜) 항목을 추가한다.

  2. ==============================

    2.사실 당신은 작은 해킹을 할 수 있습니다. 그것은 나를 100 % 작동

    사실 당신은 작은 해킹을 할 수 있습니다. 그것은 나를 100 % 작동

    internal static class EntityFrameworkHelper
    {
       public static int Compare(this byte[] b1, byte[] b2)
       {
          throw new NotImplementedException();
       }  
    }
    

    그리고 그 후 당신은 다음과 같이 사용할 수 있습니다 :

    public void SomeMethod()
    {
       var messages = Set<Message>().Where(m => m.Modified.Compare(filter.TimeStamp) > 0).ToList();
    }
    

    그것은 결국이 같은 SQL 구문을 생성합니다. "수정 된 메시지에서 선택 *> @param)을 그리고 그것은 작동 예외가 발생되지 않습니다..

  3. ==============================

    3.다른 방법은 엔티티 프레임 워크와 일반 SQL을 사용하는 것입니다.

    다른 방법은 엔티티 프레임 워크와 일반 SQL을 사용하는 것입니다.

    그것은 추가적인 내부 쿼리 (거트 아놀드의 대답은 내 의견을 참조) 피할 수 있지만, 그것은 추한 것 같습니다.

    long timeStamp = 100500;
    IEnumerable<MyTable> result = context.Database.SqlQuery<MyTable>(String.Format("SELECT * FROM MyTable WHERE ROWID>{0} ORDER BY RowId ASC", timeStamp));
    
  4. from https://stackoverflow.com/questions/17761114/select-new-records-by-timestamp-column-with-entity-framework by cc-by-sa and MIT license