【发布时间】:2022-01-21 07:01:12
【问题描述】:
我不知道为什么 LoadData 函数的返回值(如下所示)在一种情况下支持 FirstOrDefault() 方法,而在另一种情况下不支持。在这两种情况下,它都是相同的返回类型。
唯一的区别是动态参数的创建方式。
public async Task<LookupModel?> UpdateLookup(LookupModel item, Guid newUk)
var p1 = new
{
item.Code,
item.Name,
item.uk,
newUk
};
var result1 = await _db.LoadData<LookupModel, dynamic>("lu.Lookup_Update", p1);
// result1.GetType() = System.Collections.Generic.List`1[DataAccess.Models.Lookups.LookupModel]
var rtv1 = result1.FirstOrDefault(); // ok
var p2 = item.GetUpdateParams(newUk);
var result2 = await _db.LoadData<LookupModel, dynamic>("lu.Lookup_Update", p2);
// result2.GetType() = System.Collections.Generic.List`1[DataAccess.Models.Lookups.LookupModel]
var rtv2 = result2.FirstOrDefault(); // not ok
// This throws an exception as FirstOrDefault() is not defined
return rtv1;
}
// LookupModel
public dynamic GetUpdateParams(Guid newUk)
{
return new
{
this.Code,
this.Name,
this.uk,
newUK
};
}
// LoadData
public async Task<IEnumerable<T>> LoadData<T, U>(string storedProcedure, U parameters, string connectionId = "Default")
{
using IDbConnection connection = new SqlConnection(_config.GetConnectionString(connectionId));
return await connection.QueryAsync<T>(storedProcedure, parameters, commandType: CommandType.StoredProcedure);
}
【问题讨论】:
-
因为 p1 是具体类型,而 p2 是对象类型(在运行时)。所以在运行时,LoadData 将分别对匿名类型或对象是通用的。由于对象没有任何属性,因此失败。
-
它会抛出异常还是给你一个编译器错误?