2012-01-07 30 views
5

Hãy nói rằng tôi có một lớp học như:sở hữu truy cập LINQ bởi biến

public class Foo 
{ 
    public string Title {get;set;} 
} 

Bây giờ, chúng ta hãy giả sử tôi có một public List<Foo> myList mà tôi muốn lọc LINQ như vậy:

var x = myList.Where(f => f.Title == myValue); 

Mọi thứ đều tốt đẹp và rõ ràng cho đến bây giờ.

Nhưng làm cách nào để truy cập thuộc tính theo biến? Một cái gì đó như:

string myProperty = "Title"; 

var x = myList.Where(f => f.myProperty == myValue); 

Trả lời

12

Bạn có thể viết một phương pháp khuyến nông

public static class MyExtensions 
{ 
    public static object GetProperty<T>(this T obj, string name) where T : class 
    { 
     Type t = typeof(T); 
     return t.GetProperty(name).GetValue(obj, null); 
    } 
} 

và sử dụng nó như thế này

var x = myList.Where(f => f.GetProperty("Title") == myValue); 
+0

Đã yêu thích nó! Cảm ơn bạn. – Dementic

3

Đây không phải là loại tình huống mà LINQ được sử dụng. LINQ là một giao diện thông thạo để thao tác các bộ sưu tập. Truy cập các thành viên thông qua một biểu diễn văn bản được thực hiện với sự phản ánh.

object GetProperty(Foo f, string propertyName) { 
    var type = typeof(Foo); 
    var propInfo = type.GetProperty(propertyName); 
    return propInfo.GetValue(f, null); 
} 
0

bạn không thể sử dụng LINQ dynamic query from microsoft đây là mẫu mã

var query = db.Customers.Where("City == @0 and Orders.Count >= @1", "London", 10). 
      OrderBy("CompanyName"). 
      Select("New(CompanyName as Name, Phone)"); 
+0

Tại sao bạn liên kết với thỏa thuận cấp phép? –

+1

lol, bạn cần chấp nhận để tải xuống mã mẫu. – Dementic

1

Nếu bạn cần soạn truy vấn của bạn tự động khi đang bay, bạn có thể sử dụng LINQ Dynamic Query thư viện, một mẫu từ Microsoft:

Mẫu này hiển thị một kỹ thuật để soạn báo cáo LINQ trên chuyến bay , động, vào thời gian chạy.

tham khảo thư viện trong mã của bạn:

using System.Linq.Dynamic; 

truy vấn của bạn sẽ trông như thế này:

// You can use a string as the argument for the Where method 
// meaning you can compose this string dynamically 
string myProperty = "Title"; 
var x = myList.Where(myProperty + " = " + myValue); 

Cũng có thể sử dụng giữ chỗ trong chuỗi truy vấn, trong đó cải thiện khả năng đọc (hơi):

var x = myList.Where("@0 = @1", myProperty, myValue); 

Xem LSO bài này từ Scott Guthrie: Dynamic LINQ Phần 1: Using the LINQ Dynamic Query Library (Tôi không nghĩ rằng có bao giờ là một phần 2 ...)

Lưu ý: bạn phải biên dịch mã mẫu từ Microsoft và tham khảo các xây dựng lắp ráp, hoặc bạn có thể bao gồm mã trong dự án của riêng bạn.

+0

hmm, bất kỳ lý do nào tại sao nó không phải là một phần của khung .net, trông hấp dẫn .. –

+0

@SurjitSamra Tại thời điểm phát hành LINQ đầu tiên (Visual Studio 2008, C# 3.0), Microsoft đã viết rất nhiều mẫu để giúp mọi người hiểu sức mạnh của LINQ. Đây chỉ là một trong những mẫu đó, mà bản thân nó có thể rất hữu ích nhưng có thể chỉ là quá giới hạn để trở thành một phần của khuôn khổ. –

+0

Nếu tôi sẽ ở trong tình huống này thì thẳng thắn tôi sẽ thích câu trả lời của LB –

1

Tôi biết đây là một chủ đề cũ nhưng đây là một cách khác để làm điều đó. Điều này có lợi thế là nhanh hơn đáng kể nếu bạn cần làm điều đó trong một vòng lặp. Tôi đã chuyển đổi kết quả ra khỏi "func" thành đối tượng để làm cho nó có mục đích chung hơn một chút.

 var p = Expression.Parameter(typeof(string)); 
     var prop = Expression.Property(p, "Length"); 
     var con = Expression.Convert(prop, typeof(object)); 
     var exp = Expression.Lambda(con, p); 
     var func = (Func<string, object>)exp.Compile(); 

     var obj = "ABC"; 
     int len = (int)func(obj); 

Trong câu hỏi ban đầu, mã được sử dụng bên trong LINQ nên tốc độ có thể tốt.Có thể sử dụng "func" trực tiếp trong mệnh đề where cũng nếu nó được xây dựng chính xác, ví dụ:

 class ABC 
     { 
      public string Name { get; set; } 
     } 

     var p = Expression.Parameter(typeof(ABC)); 
     var prop = Expression.Property(p, "Name"); 
     var body = Expression.Equal(prop, Expression.Constant("Bob")); 
     var exp = Expression.Lambda(body, p); 
     var func = (Func<ABC, bool>)exp.Compile(); 

     ABC[] items = "Fred,Bob,Mary,Jane,Bob".Split(',').Select(s => new ABC() { Name = s }).ToArray(); 
     ABC[] bobs = items.Where(func).ToArray(); 
Các vấn đề liên quan