经过一些在线研究并从 2012 年的这篇文章中找到了这个想法
DataContext ExecuteQuery extension method returning dynamic objects
下面的扩展方法和支持类可以用来实现你想要的。
public static class DataContextExtensions {
public static IEnumerable<dynamic> ExecuteQuery(this DataContext ctx, string query, DbParameter[] parameters = null) {
using (var cmd = ctx.Connection.CreateCommand()) {
cmd.CommandText = query;
if (parameters != null) cmd.Parameters.AddRange(parameters);
ctx.Connection.Open();
using (var rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection)) {
while (rdr.Read()) {
dynamic row = new DynamicRow();
for (int i = 0; i < rdr.FieldCount; i++) {
row[rdr.GetName(i)] = rdr[i];
}
yield return row;
}
}
}
}
/// <summary>
/// DynamicRow class is similiar to ExpandoObject but with addition of indexer
/// </summary>
public class DynamicRow : DynamicObject {
private readonly Dictionary<string, object> _data = new Dictionary<string, object>();
public object this[string propertyName] {
get {
object result = null;
TryGetMember(propertyName, out result);
return result;
}
set { TrySetMember(propertyName, value); }
}
public override bool TryGetMember(GetMemberBinder binder, out object result) {
return TryGetMember(binder.Name, out result);
}
private bool TryGetMember(string propertyName, out object result) {
return _data.TryGetValue(propertyName.ToLower(), out result);
}
public override bool TrySetMember(SetMemberBinder binder, object value) {
return TrySetMember(binder.Name, value);
}
private bool TrySetMember(string propertyName, object value) {
_data[propertyName.ToLower()] = value;
return true;
}
}
}
鉴于您不愿意使用强类型模型将项目从上下文中取出,那么另一种选择是使用动态对象。这会带来其自身的风险,因为类型和属性要到运行时才能知道。
使用上面的代码,下面将从查询中提取数据,然后您可以使用 linq ToDictionary 将记录转换为所需的类型。
var sql = " Select Id, CateId From StateCategories ";
var dictionary = context.ExecuteQuery(sql).ToDictionary(_ => (int)_.Id, _ => (int)_.CateId);
这应该让你开始,你应该能够从那里提取你需要的东西。