如何在Dynamic LINQ Select语句中正确选择DataRow的字段?
解决Dynamic LINQ Select访问DataRow列的语法问题
你猜的完全没错,问题根源就是row1.Account这类直接用属性名引用列的写法——DataRow并没有把数据表的列暴露为公共属性,Dynamic LINQ没法通过这种语法解析到对应的列值,所以才会抛出"No property or field 'Account' exists in type 'DataRow'"的错误。
这里有两种可靠的解决思路:
方法1:用DataRow索引器语法访问列
DataRow原生支持通过[]索引访问列值,Dynamic LINQ可以识别这种语法,注意VB里字符串需要用双引号转义(写两个双引号):
Dim data = both.Select("new (row1[""Account""], row1[""First""], row1[""OFFERCODE""], row2[""Expiration""], row2[""OfferDescription""])")
方法2:调用Field方法(类型更安全)
如果需要明确指定列的数据类型,避免隐式转换带来的问题,可以直接在Dynamic LINQ语句里调用DataRow的Field<T>方法,记得根据实际字段类型调整泛型参数:
' 示例中Expiration假设为DateTime类型,你可以根据实际表结构修改 Dim data = both.Select("new (row1.Field<String>(""Account""), row1.Field<String>(""First""), row1.Field<String>(""OFFERCODE""), row2.Field<DateTime>(""Expiration""), row2.Field<String>(""OfferDescription""))")
额外小技巧:给结果列自定义别名
如果希望返回的动态对象有更清晰的属性名,可以用as关键字给列起别名,方便后续访问:
Dim data = both.Select("new (row1[""Account""] as Account, row1[""First""] as FirstName, row1[""OFFERCODE""] as OfferCode, row2[""Expiration""] as ExpirationDate, row2[""OfferDescription""] as OfferDescription)")
内容的提问来源于stack exchange,提问作者Chrisetiquette
相关产品推荐
相关产品推荐

