Vâng, nếu có một 1: mối quan hệ 1 giữa cha mẹ và con (khó, nhưng ví dụ dường như ngụ ý rằng) sau đó bạn có thể làm điều đó như thế này:
return db.Parents
.Where(parent => parent.Status == 1)
.Select(parent => parent.Child)
.Where(filter)
.Select(child=> child.Parent);
Nếu không nó sẽ cứng .
Bạn có thể làm điều đó với dynamic linq nhưng đó có thể là quá mức cần thiết.
Bạn có thể generate your expression tree manually, nhưng điều đó cũng khá phức tạp. Tôi đã không thử bản thân mình.
Như một phương sách cuối cùng bạn có thể gọi là yourQuery.AsEnumerable()
, điều này sẽ khiến linq-to-sql dịch truy vấn của bạn thành sql cho đến thời điểm này và thực hiện phần còn lại của công việc ở phía máy khách; sau đó bạn có thể .compile() biểu thức của bạn. Tuy nhiên bạn bị mất những lợi ích hiệu suất của LINQ-to-sql (và biên dịch() chính nó là khá chậm; bất cứ khi nào nó được thực thi, nó gọi là JIT-biên dịch):
return db.Parents
.Where(parent => parent.Status == 1)
.AsEnumerable()
.Where(parent => filter.Compile().Invoke(parent.Child))
Cá nhân tôi chỉ muốn xác định sự biểu hiện hai lần, một lần cho con và một lần cho parent.child:
Expression<Func<Child, bool>> filterChild = child => child.Status == 1;
Expression<Func<Parent, bool>> filterParent = parent => parent.Child.Status == 1;
có thể không phải là thanh lịch nhất, nhưng có lẽ dễ dàng hơn để duy trì hơn so với các giải pháp khác
Tôi không nghĩ bạn có thể biên dịch biểu thức bên trong câu lệnh linq-to-sql. Lambdas chỉ hoạt động bình thường linq – HugoRune
Hm, có vẻ như bạn nói đúng, thật không may. Tôi sẽ đề nghị một lựa chọn khác. –
Tôi nghĩ tôi sẽ sử dụng các biểu thức kết hợp hoặc Dinamic Linq, vì @HugoRune đề xuất –