2011-10-21 36 views
9

Tôi đang tìm cách để có được một cái gì đó như thế này:Entity Framework cung cấp tên cột như biến chuỗi

string _col1 = "first name"; 
string _name; 
var query = from c in ctx.Customers select c; 
_name = query.FirstOrDefault().[_name]; 

Theo như tôi có thể nhìn thấy tôi chỉ có thể được mạnh mẽ gõ tên trường nhưng tôi muốn cung cấp chúng dưới dạng biến chuỗi.

+1

bạn có nghĩa là chọn cột hoặc lọc theo cột đó? Trong ví dụ của bạn, bạn không sử dụng _col1 sau khi gán nó. Vui lòng chỉ định ... – AJC

+0

Tôi phải đặt tên cột dựa trên giá trị chuỗi từ danh sách các chuỗi sao cho nó không phải để lọc – Andy

Trả lời

19

Tôi không chắc liệu EF có cung cấp cho bạn cách để có được giá trị thuộc tính dựa trên tên chuỗi thuộc tính, nhưng bạn có thể sử dụng sự phản chiếu.

string name = typeof(Customer) 
    .GetProperty("first name") 
    .GetValue(query.First(), null) as string; 

Tôi đoán lớp EF bạn đang xử lý được gọi là Customer.

+1

Hoạt động hoàn hảo, Cảm ơn tất cả các bạn! – Andy

+0

Vui vì nó hoạt động. Vui lòng đánh dấu câu trả lời là câu trả lời đúng. Cảm ơn. –

+0

lỗi khi nhận được một tập hợp các mặt hàng thay vì chỉ một. – Matt

4

Bạn cần sử dụng sự phản chiếu cho việc này. Nếu bạn đang cố gắng để lọc theo một cột chọn dynamicly, bạn có thể thử một cái gì đó như thế này:

string propertyName 
string keyword 

ParameterExpression parameter = Expression.Parameter(typeof(YourType), "x"); 
Expression property = Expression.Property(parameter, propertyName); 
Expression target = Expression.Constant(keyword); 
Expression containsMethod = Expression.Call(property, "Contains", null, target); 
Expression<Func<YourType, bool>> lambda = 
    Expression.Lambda<Func<YourType, bool>>(containsMethod, parameter); 

var companies = repository.AsQueryable().Where(lambda); 

tôi những gì bạn đang cố gắng làm là chọn một cột cụ thể, sau đó bạn có thể sử dụng cùng một nguyên tắc để tạo ra các lamba biểu hiện và sử dụng nó trong lựa chọn (trừ điều kiện)

var companies = repository.AsQueryable().Where(whatever).Select(lambda); 
+0

là có một số tài liệu tham khảo cho điều này? "x" có nghĩa là gì? – Matt

+0

@Matt "x" là biểu thức lambda, như trong 'x => x.Property', nó có thể là bất kỳ thứ gì. Tài liệu tham khảo, tôi nhận được từ một câu hỏi tôi đã hỏi, http://stackoverflow.com/questions/7246715/use-reflection-to-get-lambda-expression-from-property-name. – AJC

0

Vì một lý do nào đó nó sẽ không hoạt động đối với tôi.

Đó là giải pháp làm việc tương tự như của tôi:

string name = null; 

// Select the PropertyInfo of the column. 
PropertyInfo propertyInfo = query.First().GetType().GetProperty("first name"); 

if (propertyInfo != null) 
{ 
    try 
    { 
    // Select the content of the column. 
    name = pi.GetValue(query.First(), null).ToString(); 
    } 
    catch (Exception) 
    { 
    // Continue with null-string. 
    } 

}

Các vấn đề liên quan