2010-01-27 62 views
0

我有一個LINQ到SQL查詢在實體具有子EntitySet的,我需要排序的某些子領域,即使用此查詢:LINQ到SQL動態排序問題

var query = from p in context.Patients 
      let order = p.Lab_Orders.First() 
      orderby order.Order_Date 
      select p; 

這個查詢運行良好,但我將如何修改它以使用DLINQ OrderBy方法我將在運行時作爲排序參數傳遞什麼?

回答

1

如果DLINQ的意思是動態查詢,那麼你不能使用這樣的查詢表達式,你必須使用lambda表達式的擴展方法。您可以通過查詢表達式開始,但最終你必須要在其切換到拉姆達:

IEnumerable<Patient> GetPatients(string orderSortField) 
{ 
    var query = 
     from p in context.Patients 
     select new 
     { 
      Patient = p, 
      FirstOrder = p.Lab_Orders.First() 
     }; 
    return p.OrderBy(orderSortField).Select(p => p.Patient); 
} 

與調用它:

var patientsByOrderDate = GetPatients("FirstOrder.Order_Date"); 
+0

感謝您的答覆。這正是我的意思 - 動態LINQ。關於混亂的Ssory,不知何故,我想每個人都知道這是什麼,因爲我們在我的工作場所使用這個術語:-)只有一個問題 - 有時我們有新的患者沒有相關的實驗室訂單。顯然在這種情況下,我不關心這種排序。我應該用FirstOrDefault()替換First()嗎? – Victor 2010-01-27 15:52:23

+0

@Victor:如果你用'FirstOrDefault'替換並嘗試對'FirstOrder.Order_Date'進行排序,如果有任何記錄沒有訂單,你將得到一個'NullReferenceException'。如果有可能沒有訂單,我會建議明確地打出訂單日期,如:FirstOrderDate = p.Lab_Orders.FirstOrDefault(o =>(DateTime?)o.Order_Date)',然後在' FirstOrderDate'。 – Aaronaught 2010-01-27 16:09:50

+0

有可能沒有訂單,但新患者分開處理,即所有患者都有訂單,或者他們都沒有訂單。但是,我認爲你的建議是站得住的,所以我會這樣做。 – Victor 2010-01-27 16:30:13

0

嘗試將「排序依據」添加到表達式樹:

var query = from p in context.Patients 
      let order = p.Lab_Orders.First() 
      select p; 
var x = Expression.Parameter(query.ElementType, "x"); 
string sortName = "order.Order_Date"; 
var selector = Expression.Lambda(Expression.PropertyOrField(x, sortName), x); 
query = query.Provider.CreateQuery(
     Expression.Call(typeof(Queryable), "OrderBy", 
       new Type[] { query.ElementType, selector.Body.Type }, 
       query.Expression, selector) 
     ) as IQueryable<Patients>; 

需要命名空間「System.Linq.Expressions」。

+0

感謝您的回覆。雖然我喜歡創建和使用表達式,但不要以爲這裏需要動態表達式,因爲動態linq無論如何都會爲你創建一個。 – Victor 2010-01-27 16:11:44

0

使用AsQueryable已()初始語句後 -

var query = from p in context.Patients 
      let order = p.Lab_Orders.First()   
      select p; 

query = query.AsQueryable().OrderBy(x => x.Lab_Orders.First().OrderDate); 
+0

感謝您的回覆。需要使用動態LINQ – Victor 2010-01-27 17:37:50