参照データ項目用のシンプルなインターフェイスがあります。
public interface IReferenceItem
{
int Id { get; set; }
string Name { get; set; }
}
ReferenceItemRepository<T> where T : IReferenceItem
次のように、データベースからそのようなアイテムを選択できるようにしたいと考えていました。
T item = db.Select<T>(s => s.Name == item.Name).FirstNonDefault<T>();
IReferenceItem
ただし、 calledMarket
と aの実装を使用すると仮定するとReferenceItemRepository<Market>
、この呼び出しは次のような SQL を生成します。
SELECT "MarketId" ,"Name"
FROM "Market"
WHERE ("Name" = "Name")
したがって、テーブルとその列の名前は正しく解決されていますが、Where 句が "Name" = "Name" に変わっているため、このテーブルのすべての行が返されます。
たとえば、MarketRepository
非ジェネリック クラスで同じことを行うと、次のようになります。
Market item = db.Select<Market>(s => s.Name == item.Name).FirstNonDefault<Market>();
私は正しいSQLを取得します:
SELECT "MarketId" ,"Name"
FROM "Market"
WHERE ("Name" = 'Chicago')
これは ServiceStack.OrmLite (私は 3.9.49 でテストしました) のバグですか、それとも何か間違ったことをしていますか、それとも OrmLite の実装ではこれは不可能なのでしょうか?
編集:
これは、Linq 式の使用に固有の問題のようです。ステートメントを次のように切り替えると、正しく機能します。
T item = db.QuerySingle<T>("Name = @name", new { Name = item.Name });
別の編集:
IReferenceItem item
の代わりに repo メソッドに渡した場合にも機能しT item
ます。しかし、これは機能しません:
public T Get(T item)
{
return db.Select<T>(s => s.Name == item.Name).FirstNonDefault<T>();
}
失敗を明らかにするには、このテーブルに複数のアイテムが必要であり、探しているレコードは、すべてのレコードをクエリしたときに返される最初のレコードではない必要があることに注意してください。そうしないと、探していたものを偶然見つけてしまいます。