我一直关注这个Example来实现 LazyLoading ,用一些值初始化lazyObject我正在 Lambda Expression的帮助下调用函数。但是,我收到转换错误,并且说它不是代理。以下是代码:
private Lazy<t_user_audit> lazyList = null;
lazyList = new Lazy<t_user_audit>(() => new t_user_audit { client.GetAudit(10) });
我在谷歌上搜索了这个错误,但它似乎没有帮助,而且我在生命中第一次看到这个错误,所以可能是我需要使用正确的语法编码帮助。那么现在任何人都可以帮助我。
public t_user_audit GetAudit(int id)
{
return _work.GetGenericRepositoryFor<t_user_audit>().SingleOrDefault(p => p.CustomerId == id);
}
现在,你可以看到我在分层架构中工作,所以我将无法发布整个代码以及我正在使用的另一件事Entity Framework.
之后,使用上面这行,我得到两个错误:
错误17无法将lambda表达式转换为'bool'类型,因为它不是委托类型
第二个是:
错误18无法使用集合初始值设定项初始化类型'BBTI.Entities.t_user_audit',因为它未实现'System.Collections.IEnumerable'
答案 0 :(得分:2)
已编辑问题的新答案
问题是你的lambda表达式无效 - 你试图使用集合初始化器语法,但你的类型不是集合。所以不要这样:
() => new t_user_audit { client.GetAudit(10) }
你想:
() => new List<t_user_audit> { client.GetAudit(10) }
原始回答
来自评论:
“它将返回一个具有单个记录的对象”
如果您的意思是声明GetAudit
返回t_User
,请执行以下操作:
public t_User GetAudit(int something)
那就是问题所在。要创建Lazy<List<Foo>>
,您需要一个代理人,该代理人将返回List<Foo>
,而不是Foo
。所以这应该有效:
lazyList = new Lazy<List<t_User>>(() => new List<t_User> { client.GetAudit(10) });
或者你可以改为Lazy<t_User>
,如果你只打算一次性使用。
另一种可能性(很难说,因为你没有在问题中提供足够的信息)是GetAudit
返回类似IEnumerable<t_User>
而不是List<t_User>
的内容。在这种情况下,您只需要根据返回值创建一个列表:
lazyList = new Lazy<List<t_User>>(() => client.GetAudit(10).ToList());
(我也强烈鼓励您开始遵循.NET命名约定,并抛弃t_
前缀。)