2011-05-04 43 views
0

我正在将旧的.net应用程序迁移到.net 4,此迁移必须分几个阶段完成,这就是为什么某些方法看起来有点不合常规。无论如何...将Linq查询投射到数据集失败

我所拥有的是一个存储过程(Analysis_select),返回一行并带有几列结果。如果我和

称之为
var result = dbContext.Analysis_select(user.UserId, Year, Week); 

一切都很好,我可以在调试器查看数据或在网格视图或类似的东西显示出来,这样的表达和存储过程真的有效!但结果是不是代码,使其余兼容...

如果我尝试将它转换为DataSet失败,Visual Studio的最高审计机关实际上这是好,但在网页上呈现崩溃时

var result = (DataSet)dbContext.Analysis_select(user.UserId, Year, Week); 

该错误是如下

无法转换类型的对象 'SingleResult`1 [Analysis_select]' 为类型 'System.Data.DataSet中'。

我读过关于从linq到DataSet的其他一些转换,但大多数方法似乎有点过分。我想保留DataSet的原因是有成千上万行代码取决于这样的结果。吮吸是的,但你能帮我解决这个问题吗?

任何帮助,高度赞赏,谢谢!

回答

1

你需要编写一个扩展方法来转换将IEnumerable转换为DataSet。以下是如何将IEnumerable转换为DataTable的示例。

private DataTable ToDataTable<T>(List<T> items) 
{ 
    var table = new DataTable(typeof (T).Name); 

    PropertyInfo[] props = typeof (T).GetProperties(BindingFlags.Public | BindingFlags.Instance); 

    foreach (PropertyInfo prop in props) 
    { 
     Type t = GetCoreType(prop.PropertyType); 
     table.Columns.Add(prop.Name, t); 
    } 

    foreach (T item in items) 
    { 
     var values = new object[props.Length]; 

     for (int i = 0; i < props.Length; i++) 
     { 
      values[i] = props[i].GetValue(item, null); 
     } 

     table.Rows.Add(values); 
    } 

    return table; 
} 
public static Type GetCoreType(Type t) 
{ 
    if (t != null && IsNullable(t)) 
    { 
     if (!t.IsValueType) 
     { 
      return t; 
     } 
     else 
     { 
      return Nullable.GetUnderlyingType(t); 
     } 
    } 
    else 
    { 
     return t; 
    } 
} 
public static bool IsNullable(Type t) 
{ 
    return !t.IsValueType || (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>)); 
} 

下面是该解决方案的源链接:http://www.chinhdo.com/20090402/convert-list-to-datatable/

+0

酷,你是指GetCoreType,该方法请告诉我? – 2011-05-04 21:10:23

+0

@Trikks - 我之前使用过这个,忘记了还有更多的方法。这是原始来源。 – Leons 2011-05-04 21:19:23

1

使用LINQ2SQL存储过程永远不会得到DataSets。你得到的是一个单一的结果。是一个IEnumerable。

2

我并不认为这是一个很好的解决方案或最佳实践;绝对有一个不同的(也许更好)的方式。 对于您有IEnumerable和没有其他手段来创建数据表的情况下,反射可以介入。 你可以使用类似下面...

public static class ExtensionMethods 
{ 
    public static DataTable ToDataTable<T>(this IEnumerable<T> items) 
    { 
     DataTable table = new DataTable(); 
     var properties = typeof(T).GetProperties(); 

     foreach (var propertyInfo in properties) 
     {     
      table.Columns.Add(propertyInfo.Name, typeof(object)); 
     } 

     foreach (var item in items) 
     { 
      var row = properties.Select(p => NormalizeObject(p.GetValue(item, null))).ToArray();         
      table.Rows.Add(row); 
     } 

     return table; 
    } 

    private static object NormalizeObject(object value) 
    { 
     Binary bin = value as Binary; 
     if (bin != null) 
     { 
      return bin.ToArray(); 
     } 

     XElement element = value as XElement; 
     if (element != null) 
     { 
      return element.ToString(); 
     } 

     return value; 
    } 
}