我有一个用于参考数据项的简单界面:
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>();
}
请注意,您需要在此表中包含多个项目才能使故障明显,并且您要查找的记录必须不是查询所有记录时返回的第一个记录;否则,您将完全出于偶然的机会找回您正在寻找的那个。