Khi làm việc với IQuerayble<TItem>
chúng ta có thể gọi Select
như thế này:Làm thế nào để khởi tạo và khởi tạo một đối tượng động trong cây biểu thức?
query.Select(item => new { A=item.Prop1, B=item.Prop2});
Và Select
phương pháp dự đoán Expression<Func<TItem,TResult>>
tôi cần phải sử dụng ExpandoObject
thay vì lớp vô danh nhưng tĩnh gõ.
Nếu có thể nó sẽ như thế nào:
query.Select(item => dynamic new ExpandoBoject { A=item.Prop1, B=item.Prop2});
Vì vậy, tôi muốn xây dựng biểu cây Expression<Func<TItem,ExpandoObject>>
nơi thuộc tính của đối tượng được khởi tạo theo cách tương tự như với loại vô danh.
Chức năng động chỉ cần thiết để khởi tạo, do đó, ok rằng Func trả về ExpandoObject
thay vì dynamic
.
Tôi không thể tìm thấy nhiều tài liệu về Expression.Dynamic
và các chất kết dính tương ứng mà tôi nên sử dụng.
Cập nhật 1
Tại sao tôi cần tất cả những thứ này?
Vì tôi muốn get primary keys.
Tôi muốn làm điều đó cho bất kỳ loại thực thể nào.
Tôi biết cách lấy danh sách các thuộc tính soạn PK, nhưng bây giờ tôi cần thực hiện một phép chiếu phức tạp của thực thể đến EntityKey
. Vâng, có thể tương đương với đẳng cấp của lớp này.
var keys = context.Set<TEntity>().Where(Expression<Func<TEntity,bool>).Select(Expression<Func<TEntity,EntityKey>>);
Như tôi đã lưu ý trong các chú thích lambdas chứa khối không thể chuyển đổi thành cây biểu thức để tôi không thể tạo từ điển đơn giản và điền vào. Bây giờ tôi đang chơi với cây biểu thức ngữ nghĩa gần với mã này:
var dict = new Dictionary<string,object>();
dict.Add("Prop1",value1);
dict.Add("Prop2",value2);
return dict
Nhưng tôi nghi ngờ EF có thể phân tích biểu thức có chứa khối. Cần kiểm tra.
Và tôi tò mò liệu nó sẽ làm việc với các đối tượng động và Expression.MemberInit vì nó hoạt động với các đối tượng tĩnh.
Cập nhật 2
Entity Framework không hỗ trợ từ điển cú pháp khởi tạo.
Nó ném NotSupportedException
với thông báo: Chỉ mục danh sách khởi tạo danh sách với một phần tử duy nhất được hỗ trợ trong LINQ to Entities.
Cập nhật 3
EF không hỗ trợ biểu thức khối là tốt.
NotSupportedException
với thông báo: Biểu thức LINQ không xác định thuộc loại 'Chặn'.
Bạn không thể làm điều gì đó tương tự như sau: 'query.Select (item => dynamic new ExpandoBoject {A = item.Prop1, B = item.Prop2});' Lippert đã nói với nó: http: // stackoverflow. com/questions/7478048/why-cant-i-do-này-động-x-new-expandoobject-foo-12-bar-mười hai. – xanatos
Tôi biết, tôi không thể. Đó là một ví dụ về ý định xây dựng cây Expression với động lực. –
Điều có thể được thực hiện là tạo một loại ẩn danh trong LINQ và sau đó, sau khi IQueryable đã hoàn tất, trong phần IEnumerable, hãy sao chép kiểu ẩn danh thành đối tượng Expando. Rõ ràng cả hai biểu thức có thể được tự động phát hiện theo một cách nào đó. – xanatos