我正面对这种情况,对我来说真的很奇怪。
我有A班有以下
public class A
{
public A()
{
Values = new List<B>();
}
public virtual IList<B> Values { get; set; }
}
我有一个方法可以从db中读取所有A记录。
var all = await GetAll();
这是我的方法
public async Task<IList<A>> GetAll(int id1)
{
var parameters = new[]
{
new SqlParameter("@ProductTypeId", SqlDbType.Int) {Value = id1},
};
return (await _sqlCommandWrapper.ExecuteReaderAsync("SPName", r => new A
{
values = JsonConvert.DeserializeObject<IList<B>>(r["Values"].ToString())
}, parameters)).ToList();
}
我的db列r["Values"]
将返回可以反序列化为B类列表的json。
然后我使用linq来查询我的所有A:
var subitems = all .Where(a=> a.Values .Count > 0).ToList();
如果我的r["Values"]
返回数据,则可以正常工作。
但如果不是,那么a.Values
为空?
无论如何,我在我的A构造函数中定义了Values = new List<B>();
答案 0 :(得分:1)
问题的原因是,在执行Json反序列化的代码替换类型(IList<B>
)的值之后,您没有对在构造函数中实例化的原始列表执行任何操作
values = JsonConvert.DeserializeObject<IList<B>>(r["Values"].ToString())
当r["Values"].ToString()
是一个有效的Json时,它被反序列化为IList<B>
,这是一个赋值调用,现在当r["Values"].ToString()
生成一个不匹配的Json或为空时,结果如下代码是空的
JsonConvert.DeserializeObject<IList<B>>(r["Values"].ToString())
如果您打算使用在构造函数中实例化的List,那么它应该是:
Values.Add(JsonConvert.DeserializeObject<B>(r["Values"].ToString()))
在这种情况下,r["Values"].ToString()
为类型B
而不是IList<B>
生成Json
然而,这肯定不会起作用,因为你正在生成一个新的A,然后将其添加到IList<A>
并作为Task结果返回,因此该部分也需要修改