传递params表达式导致奇怪的错误

时间:2013-03-29 14:36:56

标签: c# asp.net asp.net-mvc-4 expression ormlite-servicestack

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

感谢

2 个答案:

答案 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的任何地址?