程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 使用dynamic linq 解決自定義查詢的若干弊端

使用dynamic linq 解決自定義查詢的若干弊端

編輯:C#入門知識

        在項目中想必大家肯定是使用各種ORM, 如:NH、EF、fluent Data。 然而我在使用ORM的這幾年中,隨著數據庫的結構越來越復雜,自定義查詢的越來越多,但是一直沒有解決一個問題就是自定義查詢,每遇到自定義查詢時就需要手動建個業務實體來承載自定義查詢的結果集。

        上周在蕭秦的博客中突然發現了一句代碼,讓我眼前一亮:

        

public IEnumerable<dynamic> Get()
{
        //構建查詢參數
        var pQuery = ParamQuery.Instance()
            .Select("A.*,B.PermissionName as ParentName")
            .From(@"sys_permission A left join sys_permission B on B.PermissionCode = A.ParentCode");

        //調用服務基類中的共通方法返回查詢結果
        return service.GetDynamicList(pQuery);
}

   使用了IEnmuerable<dynamic> 來解決自定義查詢的結果集問題,隨後我請教了蕭秦,他使用的是fluent Data ORM, 這個框架是支持IEnumerable<dynamic>,而EF不支持。 所以在使用自定義查詢時: 1、可以創建業務實體來承載結果集。 2、使用dynamic linq來解決,既然ORM不支持,那麼使用SqlHelper來返回DataTable,在DataTable的基礎上使用dynamic linq來解決,想想如果是做數據管理平台的話,肯定大部分功能都是報表多、查詢多,那麼這就是個大問題,一個項目組10個人,那麼每個人如果都去建幾個業務實體,那麼Model豈不是很變態。

     

DataTable dt = GetDataTable();
var query = from p in dt.AsEnumerable()
                  select new 
                  {
                          ID=Convert.toInt32(p["StuID"]),
                          Name=p["StuName"].toString(),
                          Chinese=Convert.toInt32(p["Chinese"])
                   };

  最後返回IEnumerable<dynamic>, 在寫這個demo時候我先使用ID=p.Field<int>("StuID"), 然後在遍歷數據時提示轉化無效異常,才采用了p["StuID"]的寫法,實際上這時p就是一個DataRow對象。這個過程只是省去了再去創建自定義Model的過程。

 完整方法:

public IEnumerable<dynamic> Get()
{
DataTable dt = GetDataTable();
var query = from p in dt.AsEnumerable()
                  select new 
                  {
                          ID=Convert.toInt32(p["StuID"]),
                          Name=p["StuName"].toString(),
                          Chinese=Convert.toInt32(p["Chinese"])
                   };
      return query;
}

  

      僅僅是個人工作過程中遇到的問題和自己想出的解決辦法,有更好的多謝大家指教。同時猜測微軟會不會在以後的版本中升級這個功能呢?

      

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved