4

我有一个模型调用地址,使用该模型我创建了一些 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)

此过程接受表达式并消除错误

谢谢

4

2 回答 2

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);
    }
}
于 2013-04-15T18:52:20.173 回答
1

我的猜测是该address.GetByParams(...)部分返回一个空集,因此 SelectList 的默认选择不能设置为第 0 个元素(它没有)。

检查您是否真的通过 GetByParams 从数据库中获得结果。是否存在任何 AddressType 等于 2 的地址?

于 2013-03-29T14:44:17.510 回答