【发布时间】:2013-03-29 14:36:55
【问题描述】:
我有一个模型调用地址,我使用该模型创建了一些 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 文件,所以我不知道属性名称并且需要保持异常。
编辑:
为了清楚地了解未来的阅读:我正在针对 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)
此过程接受表达式并消除错误
谢谢
【问题讨论】:
-
异常到底是在哪里抛出的?
-
您必须发布异常的整个堆栈跟踪。您还有一个错误 - data.Count() 将始终返回当前页面的大小,而不是整个集合。
-
为什么参数类型使用
Expression<Func<address, bool>>而不是简单的Func<address, bool>? -
数据库表的内容是什么,该语句的预期返回是什么?您需要消除可能的错误来源。您可以尝试使用 x=> x.AddressType == 2 直接调用该语句,或者在没有 where 的情况下测试它是否有效。
-
@nmat 我这里没有列出内容的原因是因为地址可以是你喜欢的任何东西,它只是一个地址,并且预期的类型在顶部带有 IEnumerable 也无法调用addressType == 因为这是一个 TT 文件,其中包含对 TT 文件未知的任何类型的通用查询,该问题更多地针对会理解该问题的人,请参阅下面 JOn 和 drax 的 cmets 以获得更好的理解,但是感谢您的意见
标签: c# asp.net asp.net-mvc-4 expression ormlite-servicestack