2008-09-18 224 views

回答

4

您可以將您的LINQ的結果設置爲List,你不必嚴格使用DataSet作爲報告SetDataSource,您可以用IEnumerable提供一個水晶報表數據。由於List繼承自IEnumerable,因此您可以將報告的數據源設置爲列表,您只需在您的LINQ結果集上調用.ToList()方法即可。基本上:

 CrystalReport1 cr1 = new CrystalReport1(); 

     var results = (from obj in context.tSamples 
         where obj.ID == 112 
         select new { obj.Name, obj.Model, obj.Producer }).ToList(); 

     cr1.SetDataSource(results); 
     crystalReportsViewer1.ReportSource = cr1; 
1

雖然我自己沒有嘗試過,但它似乎可以通過使用DataContext.LoadOptions的組合來使其渴望接受關係,而GetCommand(IQueryable)返回保留關係的SQLCommand對象。

查看更多關於MSDN Forums的信息。

2

msdn doc的建議您可以將Crystal Report綁定到ICollection。

我可以推薦一個List(T)嗎?

0

如果您有dbnull值,上面的代碼將無法在Web應用程序中工作。您必須將結果列表對象轉換爲數據集或數據表。沒有內置的方法。我經歷了同樣的問題,經過幾個小時在互聯網上的探索,我找到了解決方案,並希望在這裏分享,以幫助任何人堅持下去。你必須做的一類在你的項目中: -

public class CollectionHelper 
    { 
     public CollectionHelper() 
     { 
     } 

     // this is the method I have been using 
     public DataTable ConvertTo<T>(IList<T> list) 
     { 
      DataTable table = CreateTable<T>(); 
      Type entityType = typeof(T); 
      PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(entityType); 

      foreach (T item in list) 
      { 
       DataRow row = table.NewRow(); 

       foreach (PropertyDescriptor prop in properties) 
       { 
        row[prop.Name] = prop.GetValue(item) ?? DBNull.Value; 
       } 

       table.Rows.Add(row); 
      } 

      return table; 
     } 

     public static DataTable CreateTable<T>() 
     { 
      Type entityType = typeof(T); 
      DataTable table = new DataTable(entityType.Name); 
      PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(entityType); 

      foreach (PropertyDescriptor prop in properties) 
      { 
       // HERE IS WHERE THE ERROR IS THROWN FOR NULLABLE TYPES 
       table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(
      prop.PropertyType) ?? prop.PropertyType); 
      } 

      return table; 
     } 
    } 

,在這裏設置您的水晶報表

CrystalReport1 cr1 = new CrystalReport1(); 

      var results = (from obj in context.tSamples 
          where obj.ID == 112 
          select new { obj.Name, obj.Model, obj.Producer }).ToList(); 
      CollectionHelper ch = new CollectionHelper(); 
      DataTable dt = ch.ConvertTo(results); 
      cr1.SetDataSource(dt); 
      crystalReportsViewer1.ReportSource = cr1;