3

参照データ項目用のシンプルなインターフェイスがあります。

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")

したがって、テーブルとその列の名前は正しく解決されていますが、Wh​​ere 句が "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>();
}

失敗を明らかにするには、このテーブルに複数のアイテムが必要であり、探しているレコードは、すべてのレコードをクエリしたときに返される最初のレコードではない必要があることに注意してください。そうしないと、探していたものを偶然見つけてしまいます。

4

1 に答える 1