我正在测试PetaPoco作为Fluent NHibernate的替代品,我添加了扩展StaTypPocoQueries.PetaPoco来使用lambda表达式来构建查询,就像Fluent NHibernate一样。
我不想创建PetaPoco的Database类的实例,因此我创建了一个Configuration Manager类来在程序启动时对其进行配置。
public class PetaPocoSessionManager
{
public static string connectionString;
public PetaPocoSessionManager()
{
connectionString = null;
}
public IDatabase CreateSession()
{
return DatabaseConfiguration.Build()
.UsingProvider<SqlServerDatabaseProvider>()
.UsingConnectionString(connectionString)
.UsingDefaultMapper<ConventionMapper>()
.WithAutoSelect()
.Create();
}
}
现在在我的存储库类中,我构建了一个通过某个特定字段进行查询的方法。
[TableName("co")]
public class CustomerOrder
{
public string OrderNumber { get; set; }
public string CustomerNumber { get; set; }
public decimal Price { get; set; }
public DateTime OrderDate { get; set; }
public string OrderType { get; set; }
public string Status { get; set; }
public string Warehouse { get; set; }
public string OriginSite { get; set; }
public string TakenBy { get; set; }
public string ExportType { get; set; }
public string Contact { get; set; }
public string CurrencyCode { get; set; }
public string TaxCode { get; set; }
}
public class CustomerOrderBL
{
private IDatabase session;
public CustomerOrderBL(IDatabase session)
{
this.session = session;
}
public CustomerOrder GetByCoNum(string coNum)
{
return session.FirstOrDefault<CustomerOrder>(x => x.CustomerNumber == coNum);
}
}
但是我在lambda表达式中遇到错误,该错误表示“无法将lambda表达式转换为'string'类型,因为它不是委托类型”。问题是,如果我使用经典的PetaPoco配置而不是流畅的话,我没有那个错误(这就是,每个请求创建一个新的Database对象)。
难道我做错了什么?或者StaTypPocoQueries与流畅配置不兼容?
提前致谢。
扩展方法适用于Database
类型而不是IDatabase
。我认为这就是它无法正确解决的原因。
请允许我解释一下。
因为在您的CustomerOrderBL类中,您引用的是IDatabase
而不是Database
,这导致session.FirstOrDefault<CustomerOrder>(x => x.CustomerNumber == coNum)
解析为T SingleOrDefault<T>(object primaryKey);
,而不是StaTypePocoQueries.PetaPoco包定义的扩展方法。
您可以使用以下类轻松地测试它
public class CustomerOrderBL
{
private Database session;
public CustomerOrderBL(Database session)
{
this.session = session;
}
public CustomerOrder GetByCoNum(string coNum)
{
return session.FirstOrDefault<CustomerOrder>(x => x.CustomerNumber == coNum);
}
}
如果这样,正如我所预测的那样,StaTypPocoQueries.PetaPoco的作者Aaron Sherber帮助了PetaPoco,并且对GH非常活跃。我打开一个问题与他讨论,因为他应该为数据库和IDatabase提供扩展