5

RowIdSQL Server データベースにタイムスタンプ列 ( ) を持つテーブルがあります。

このタイムスタンプに従って新しい行をクエリしたい。SQLクエリは次のとおりです

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

0x0000000000A99B06前のクエリからの最大タイムスタンプ値です。

Entity Framework データベース ファーストを使用してこのようなクエリを作成するにはどうすればよいですか? RowIdプロパティにマップさbyte[]れ、LINQ クエリでバイト配列を比較する方法がわかりません。

4

3 に答える 3

17

実際、小さなハックを行うことができます。それは私にとって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 構文を生成します: "Select * from Messages Where Modified > @param).そしてそれは機能します.例外は決してスローされません.

于 2013-10-16T11:47:46.137 に答える
1

もう 1 つの方法は、EntityFramework でプレーン SQL を使用することです。

追加の内部クエリを回避できます (Gert Arnold の回答と私のコメントを参照)。

long timeStamp = 100500;
IEnumerable<MyTable> result = context.Database.SqlQuery<MyTable>(String.Format("SELECT * FROM MyTable WHERE ROWID>{0} ORDER BY RowId ASC", timeStamp));
于 2013-07-22T07:43:12.723 に答える
1

>=タイムスタンプの比較で演算子が許可されていないため、Entity Framework ではこれを行うことはできません。のみを許可します=。あなたは例えばすることができます

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

しかし、それはあまり役に立ちません。したがって、ID 列の値など、新しい行を取得する別の方法を見つけるか、「リアルタイム」タイム スタンプ (日時) 列を追加する必要があります。

于 2013-07-21T09:22:33.767 に答える