2011-03-09 3 views
3

Ma question semble assez simple mais est devenue fastidieuse pour moi. Dans mon projet, j'ai un fichier DBML qui sert de couche d'accès aux données. Il existe une autre méthode d'utilité qui convertit le résultat existant en un ensemble de données. Ci-dessous ma méthode:Convertir plusieurs tables en ensemble de données

#region To convert from LINQ to dataset 
     /// <summary> 
     /// Function convert linq to Dataset 
     /// </summary> 
     public static DataSet LINQToDataTable<T>(IEnumerable<T> varlist) 
     { 
      DataSet ds = new DataSet(); 
      //Creating an object of datatable 
      DataTable dtReturn = new DataTable(); 

      dtReturn.Rows.Clear(); 

      // column names 
      PropertyInfo[] oProps = null; 

      if (varlist == null) return ds; 

      foreach (T rec in varlist) 
      { 
       // Use reflection to get property names, to create table, Only first time, others will follow 
       if (oProps == null) 
       { 
        oProps = ((Type)rec.GetType()).GetProperties(); 
        foreach (PropertyInfo pi in oProps) 
        { 
         Type colType = pi.PropertyType; 

         if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition() 
         == typeof(Nullable<>))) 
         { 
          colType = colType.GetGenericArguments()[0]; 
         } 

         dtReturn.Columns.Add(new DataColumn(pi.Name, colType)); 
        } 
       } 

       DataRow dr = dtReturn.NewRow(); 

       foreach (PropertyInfo pi in oProps) 
       { 
        dr[pi.Name] = pi.GetValue(rec, null) == null ? DBNull.Value : pi.GetValue 
        (rec, null); 
       } 

       dtReturn.Rows.Add(dr); 
      } 
      ds.Tables.Add(dtReturn); 
      return ds; 
     } 
     #endregion 

maintenant un de mes procédure stockée a trois requêtes Select en cours d'exécution revenant ainsi trois tables à partir de là. Quand je retourne le résultat sur le code derrière et regarde rapidement le résultat, c'est en me donnant la seule table sur les trois.

Quelle sera la solution possible. Sil te plait aide moi. Je pense qu'il pourrait y avoir un problème avec le LOC ci-dessus.

Mise à jour de requête Sql

ALTER PROCEDURE [dbo].[usp_GetTenantPropertyDetailsForAgreement] 
    @TenantId INT, 
    @PropertyDetailsId INT, 
    @BillingPlanId INT 
) 
AS 
BEGIN 

    -- Select Tenant's Name and his/her household member info from the two tables 
    SELECT  (tbl_MSTTenantPersonalInfo.FirstName + ' ' + ISNULL(tbl_MSTTenantPersonalInfo.MiddleInitial,'') + ' ' + tbl_MSTTenantPersonalInfo.LastName) AS Tenant, 
       (ISNULL(tbl_TenantFamilyMemberInfo.FirstName,'') + ' ' + ISNULL(tbl_TenantFamilyMemberInfo.MiddleName,'') + ' ' + ISNULL(tbl_TenantFamilyMemberInfo.LastName,'')) AS FMName 
    FROM  tbl_MSTTenantPersonalInfo LEFT JOIN 
       tbl_TenantFamilyMemberInfo 
    ON   tbl_MSTTenantPersonalInfo.TenantPersonalInfoID = tbl_TenantFamilyMemberInfo.TenantPersonalInfoID 
    WHERE  tbl_MSTTenantPersonalInfo.TenantPersonalInfoID = @TenantId AND (tbl_MSTTenantPersonalInfo.IsDelete = 0) 



    SELECT  tbl_PropertyConstructionInfo.BedRoomsNo, 
       (ISNULL(tbl_MSTPropertyDetails.Area,'')+''+ ISNULL(tbl_MSTPropertyDetails.Project,'')+' '+ ISNULL(tbl_MSTPropertyDetails.Unit,'')) AS Project, 
       (tbl_MSTPropertyDetails.Address+' <br/>'+ ISNULL(tbl_MSTPropertyDetails.Address2,'')+' <br/>'+tbl_MSTPropertyDetails.City+' '+tbl_MSTPropertyDetails.State 
        +' '+ tbl_MSTPropertyDetails.Zip) AS PropertyAdress 
    FROM   tbl_MSTPropertyDetails INNER JOIN 
         tbl_PropertyConstructionInfo ON tbl_MSTPropertyDetails.PropertyDetailsID = tbl_PropertyConstructionInfo.PropertyDetailsID 
    WHERE  tbl_MSTPropertyDetails.PropertyDetailsID = @PropertyDetailsId AND tbl_MSTPropertyDetails.IsDelete = 0 



    SELECT  BiilingDayOfMonth, LateFeeAmount, LateFeeAppliedDayofMonth 
    FROM  tbl_MSTBillingPlan 
    WHERE  BillingplanID = @BillingPlanId 

END 

méthode appel de procédure stockée

/// <summary> 
     /// 
     /// </summary> 
     /// <returns></returns> 
     public DataSet GetTenantPropertyDetailsForAgreement(int tenantId, int propertyId,int billingPlanId) 
     { 
      DataSet ds = new DataSet(); 
      try 
      { 
       using (objDataManagerDataContext = new DataManagerDataContext()) 
       { 
        ds = Utility.LINQToDataTable(objDataManagerDataContext.usp_GetTenantPropertyDetailsForAgreement(tenantId,propertyId,billingPlanId)); 
       } 
      } 
      catch (Exception ex) 
      { 
       SaveLogger.WriteError(ex.ToString()); 
      } 
      return ds; 
     } 

méthode DBML FICHIER

[global::System.Data.Linq.Mapping.FunctionAttribute(Name="dbo.usp_GetTenantPropertyDetailsForAgreement")] 
      public IEnumerable<usp_GetTenantPropertyDetailsForAgreementResult> usp_GetTenantPropertyDetailsForAgreement([global::System.Data.Linq.Mapping.ParameterAttribute(Name = "TenantId", DbType = "Int")] System.Nullable<int> tenantId, [global::System.Data.Linq.Mapping.ParameterAttribute(Name = "PropertyDetailsId", DbType = "Int")] System.Nullable<int> propertyDetailsId, [global::System.Data.Linq.Mapping.ParameterAttribute(Name = "BillingPlanId", DbType = "Int")] System.Nullable<int> billingPlanId) 
      { 
       IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), tenantId, propertyDetailsId, billingPlanId); 
       return ((IEnumerable<usp_GetTenantPropertyDetailsForAgreementResult>)(result.ReturnValue)); 
      } 
+0

où est votre procédure stockée; s'il vous plaît poster votre code où vous avez écrit le code pour appeler SP –

Répondre

2

essayer sans LINQ si vous le pouvez. Juste régulier ado.net. De cette façon, vous n'avez pas besoin de faire la conversion de linq en ensemble de données.

+0

Si je peux faire alors évident je ferai. Mais comme je l'ai dit, j'utilise le fichier DBML donc pour une seule méthode je ne peux pas utiliser le moyen habituel ado.net ... –

+0

Problème résolu –

Questions connexes