2013-08-25 82 views
1

我試圖使用動態LINQ運行時數據網格過濾與DataGridFiltering project但我有一個枚舉的問題。動態LINQ枚舉過濾錯誤

例如,我有一個包含類似這樣的枚舉屬性的類:

public class Student 
{ 
    public Student(int id,string name,StudentType type) 
    { 
     Id = id; 
     Name = name; 
     Type = type; 
    } 

    public int Id { get; set; } 
    public string Name { get; set; } 
    public StudentType Type { get; set; } 
} 

和StudentType枚舉是:

public enum StudentType : byte 
{ 
    Normal=0, 
    Good 
}; 

我創建一個控制器類與學生的名單的工作。

在我的控制器中,我有一種按類型查找學生的方法。

這是FindByType方法:

public IList<Student> FindByType(string type) 
    { 
     return _students.AsQueryable().Where("Type.ToString().StartWith(@0)",type).ToList(); 
    } 

當我打電話FindByType方法我得到這個錯誤在動態LINQ的ParseMemberAccess方法:

上式方法 '枚舉' 而無法訪問

回答

0

我認爲問題是您正在使用的動態linq庫不支持任何枚舉方法,例如Enum.Equals(otherVal),o r Enum.ToString()。一種方法來解決這個問題,如果你必須使用動態LINQ是:

public IList<Student> FindByType(StudentType type) 
{ 
    return _students.AsQueryable().Where("Type = (@0)", type).ToList(); 
} 

但是,如果你能使用標準LINQ,你真的想在一個字符串傳遞出於某種原因,像這是乾淨多了:

public IList<Student> FindByType(string type) 
{ 
    return _students.Where(s => s.Type.ToString().StartsWith(type)).ToList(); 
} 

編輯: 如果需要使用StartsWith搜索能力,你不能用上述標準的LINQ查詢,這裏的東西,將給予很多相同的結果更多代碼

public IList<Student> FindByType(string type) 
{ 
    //Replace e.StartsWith with whatever method you wish to filter by 
    var studentTypeNames =typeof(StudentType).GetEnumNames().Where(e => e.StartsWith(type)).ToList(); 
    var students = new List<Student>(); 
    foreach (var studentTypeName in studentTypeNames) 
    { 
     StudentType studentType; 
     Enum.TryParse(studentTypeName, true, out studentType); 
     students.AddRange(_students.AsQueryable().Where("Type = (@0)", studentType).ToList()); 
    } 
    return students; 
} 
+0

感謝您的回答。我使用最新版本的動態LINQ。因爲我使用datagridfilter我不能寫Type.ToString()的Type instate。用戶不知道這是一個枚舉用戶請參閱類型字段az字符串,因此需要通過開始,結束或包含條件來過濾它。 –

+0

我在代碼中添加了一個代碼,可以指定一個字符串,並且您將通過StartsWith過濾返回您希望的列表。然而,你應該能夠得到你想要的中間一段代碼,因爲那個代碼也接受一個字符串方法並使用StartsWith過濾。有什麼理由不能使用標準的Linq? –

-1

在動態LINQ的不要去碰從調用類的方法,並非預先定義的類陣列,用於解決方法您可以在Student類像這樣添加屬性:

public string StudentTypeString {get {return Type.ToString(); } } 

,並使用一個查詢

public IList<Student> FindByType(string type) 
{ 
    return _students.AsQueryable().Where("StudentTypeString.StartWith(@0)",type).ToList(); 
} 
+0

你是什麼意思預定義在類數組中? – liang

+0

@liang我的意思是在DinamicLinq源代碼中靜態只讀類型[] predefinedTypes',如果這個字段不包含你的類型,那麼將會引發ParseError,原因是'MethodsAreInaccessible' – Grundy

+0

@Grundy當我嘗試去解析錯誤時,肯定是原因直接在Student類的屬性上使用擴展方法。根據我的實驗,甚至在Student類中定義的屬性/函數中使用擴展方法也會導致一些解析錯誤。 – liang