Tôi đang gặp sự cố khi hiểu sự khác biệt giữa cách Biểu thức và Func hoạt động. Vấn đề này bật lên khi ai đó thay đổi một chữ ký phương pháp từ:Bối rối về việc chuyển đối số Biểu thức so với Func
public static List<Thing> ThingList(Func<Thing, bool> aWhere)
Để
public static List<Thing> ThingList(Expression<Func<Thing, bool>> aWhere)
nào phá vỡ mã gọi tôi. Mã gọi cũ (mà làm việc) trông như thế này:
...
object y = new object();
Func<Thing, bool> whereFunc = (p) => p == y;
things = ThingManager.ThingList(whereFunc);
mã mới (không hoạt động) trông như thế này:
...
object x = new object();
Expression<Func<Thing, bool>> whereExpr = (p) => p == x;
things = ThingManager.ThingList(whereExpr);
này thất bại trong ThingList (...) trên dòng sử dụng biểu thức:
var query = (from t in context.Things.Where(aWhere)
...
với lỗi runtime:
Unable to create a constant value of type 'System.Object'. Only primitive types ('such as Int32, String, and Guid') are supported in this context.
Ví dụ này được giả tạo, nhưng tôi đoán là nó có liên quan đến biến đối tượng địa phương x không được sao chép đúng cách vào biểu thức.
Ai đó có thể giải thích cách xử lý tình huống này nói chung và tại sao Func
hoạt động nhưng Expression
thì không?
có, nó làm theo cách của mình vào một khuôn khổ thực thể. Tôi đoán tôi sẽ phải thực hiện hai phương pháp, một cho Expression, và một cho Func để sử dụng khi cần thiết. – Erix