2014-11-05 90 views
0

如何將屬性選擇器的字符串表示形式轉換爲lambda表達式?將字符串轉換爲針對集合的Lambda表達式

輸入的格式爲:

"Child.Name" 

我需要將其轉換成排序依據子句中使用的謂語;

query.OrderBy(x => x.Child.FirstOrDefault().Name); 

是否有可能也有一個可行的解決方案,如果屬性不是一個集合,要與一個標準的屬性或字段,例如工作;

"Quantity" 

會創建謂詞,例如;

x => x.Quantity 

編輯:

只是試圖改寫上面的問題,如果我可以改變輸入字符串,纔有可能執行;

"Child.FirstOrDefault().Name" 

作爲

x => x.Child.FirstOrDefault().Name 

一個排序依據內?

+1

你或許應該調查[動態LINQ(http://weblogs.asp.net/scottgu/dynamic- linq-part-1-using-the-linq-dynamic-query-library) – 2014-11-05 15:57:12

+1

'Child'對象的類型是什麼? – mggSoft 2014-11-05 16:05:07

+0

你是什麼意思*「我需要將其轉換爲謂詞」*?你是否已經擁有一個帶有「子集」屬性的對象? – 2014-11-05 16:08:18

回答

0

我認爲,你首先需要通過名稱使用Activator類型獲取類的一個實例:

var child = System.Activator.CreateInstance(Type.GetType("Assembly", "Child")); 

然後你可以通過名稱與GetProperty屬性:

var childType = (typeof)child; 
var name = childType.GetProperty("Name"); 

然後,您可以將這些類型傳遞給您的查詢。可以使用the LINQ Predicate Builder library

+0

爲什麼要通過實例化對象的箍來獲取類型? 'var childType = Type.GetType(「NAMESPACE.Child,ASSEMBLY_NAME」);' – decPL 2014-11-05 16:06:38

0

有一個應用程序可以解決你的問題。試試看,告訴我一些事情。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 
    static class Program 
    { 
     /// <summary> 
     /// Punto de entrada principal para la aplicación. 
     /// </summary> 
     [STAThread] 
     static void Main() 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 

      List<Parent> Parents = new List<Parent>(); 
      List<Parent> orderedParents = Parents.Cast<Parent>().OrderBy(x => x.Cast<Child>().Select(y => y.myName)).ToList(); 
     } 
    } 

    public class Parent: IQueryable 
    { 
     List<Child> child = new List<Child>(); 

     #region Miembros de IQueryable 

     public Type ElementType 
     { 
      get { throw new NotImplementedException(); } 
     } 

     public System.Linq.Expressions.Expression Expression 
     { 
      get { throw new NotImplementedException(); } 
     } 

     public IQueryProvider Provider 
     { 
      get { throw new NotImplementedException(); } 
     } 

     #endregion 

     #region Miembros de IEnumerable 

     public System.Collections.IEnumerator GetEnumerator() 
     { 
      throw new NotImplementedException(); 
     } 

     #endregion 
    } 

    public class Child: Parent 
    { 
     public string myName; 
    } 
} 
0

下會返回一個集合的屬性的字符串值:

string propertyValue = source.GetType() 
       .GetProperty(stringProperty) 
       .GetValue(query.FirstOrDefault(), null) as string; 
+0

這是一條評論,而不是答案。 – 2014-11-06 13:31:02

+0

約翰桑德斯 - 你是什麼意思? – 2014-11-06 13:32:22

+0

你還沒有回答這個問題。你寫的是一個很好的評論。 – 2014-11-06 13:37:12

相關問題