我正在测试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与流畅的配置不兼容?
谢谢。
答案 0 :(得分:2)
扩展方法适用于类型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的作者Aaron Sherber.PetaPoco可以为PetaPoco提供帮助,并且对GH非常积极。我要与他讨论一个问题,因为也许他应该同时提供数据库和IDatabase的扩展