我有一个模型调用地址,使用该模型我创建了一些crud操作,在执行此操作的过程中,我想要一种方法,我可以基于任意数量的属性创建查询:
public static IEnumerable<address> GetByParams(Expression<Func<address, bool>> predicate, int? pageNumber, int? pageSize)
{
using (IDbConnection db = DbFactory.OpenDbConnection())
{
if ((pageNumber != null) && (pageSize != null))
{
var data = db.Where<address>(predicate).Skip((int) pageNumber).Take((int) pageSize).ToList();
if (data.Any())
{
data[0].TotalCount = data.Count();
data[0].TotalPages = (int) (data.Count()/pageSize);
}
return data;
}
//this is the code that creates the error
return db.Where<address>(predicate);
}
}
然后我尝试用以下代码测试此代码:
ViewBag.PossibleBilling = new SelectList(address.GetByParams(x=> x.AddressType == 2,null,null),0);
然而,这会导致最奇怪的错误:(错误不是来自selectList)
The given key was not present in the dictionary.
我试图谷歌这一点,但结果比实际错误更复杂。我想这与我没有将谓词设置为正确的类型有关,或者在我将谓词传递到where之前必须先发生一些事情。
谓词的原因是我有一个TT文件为我生成所有这些,所以我不知道属性名称和需要保持anom。
编辑:
为了明确将来的阅读:我在servicestack.ormlite上使用它:https://github.com/ServiceStack/ServiceStack.OrmLite
我正在尝试使用我的模型创建一个TT文件来构建一些基本的crud方法,我在ormlite中找到了这段代码:
System.Collections.Generic.List<T> Where<T>(this System.Data.IDbConnection dbConn, object anonType) Member of ServiceStack.OrmLite.OrmLiteReadConnectionExtensions
对象anonType可以是我自己的查询/谓词
分页代码是错误的,但这不是错误的过程,drax解决的问题是我使用的是Where,当我需要的只是一个带参数的选择。
此改进将代码的使用更改为以下过程:
public static List<T> Select<T>(this IDbConnection dbConn, Expression<Func<T, bool>> predicate)
此过程接受Expression并消除错误
感谢
答案 0 :(得分:2)
我认为您应该使用Select而不是Where扩展方法。所以你的例子可以写成:
public static IEnumerable<address> GetByParams(Expression<Func<address, bool>> predicate, int? pageNumber, int? pageSize)
{
using (IDbConnection db = DbFactory.OpenDbConnection())
{
if ((pageNumber != null) && (pageSize != null))
{
var data = db.Select<address>(predicate).Skip((int) pageNumber).Take((int) pageSize).ToList();
if (data.Any())
{
data[0].TotalCount = data.Count();
data[0].TotalPages = (int) (data.Count()/pageSize);
}
return data;
}
//this is the code that creates the error
return db.Select<address>(predicate);
}
}
答案 1 :(得分:1)
我的猜测是address.GetByParams(...)
部分返回一个空集,因此SelectList的默认选择不能设置为第0个元素(它没有)。
检查您是否通过GetByParams从数据库中获得结果。是否存在AddressType等于2的任何地址?