2015-12-04 17 views
11

Tôi đang cố di chuyển dự án cũ từ Linq2Sql sang EF6 và tôi gặp vấn đề sau. cấu trúc dbEF 6 lọc các bộ sưu tập trẻ em

Dự án này là đa ngôn ngữ (tức là tất cả các văn bản có nhiều hơn 1 dịch) và tôi đã sau:

Example of DB tables

cách tốt nhất để có được tất cả ExampleEntity1 đối tượng với tất cả hồ sơ LocalizedContent lọc bởi là gì id ngôn ngữ hiện tại?

tôi có thể tải tất cả đối tượng ExampleEntity1 với tất cả hồ sơ LocalizedContent sử dụng đoạn mã sau: dc.ExampleEntity1.Include(ee => ee.TextEntry.LocalizedContents);

Trong Linq2Sql Tôi có thể lọc hồ sơ LocalizedContent sử dụng loadOptions.AssociateWith nhưng tôi không thể tìm thấy bất kỳ giải pháp cho EF6.

Tôi thấy các câu hỏi cũ tương tự (được đăng như 2-3 năm trước) và tôi chỉ tự hỏi liệu có giải pháp cho EF6 hay không. Nó là một tính năng rất quan trọng đối với tôi bởi vì tôi có hàng chục thực thể trong dự án và tôi không muốn tạo các đối tượng tùy chỉnh cho mỗi truy vấn chọn.

Tôi cũng thấy EntityFramework.DynamicFilters gói NuGet mà có thể giúp đỡ với vấn đề của tôi, nhưng tôi muốn sử dụng "bản địa" chức năng EF6 nếu có thể ..

+0

Một tùy chọn mà bạn nghĩ đến nhưng có thể không hoạt động cho trường hợp của bạn: hàm cơ sở dữ liệu tùy chỉnh nhận id ngôn ngữ hiện tại và TextEntryId và trả về LocalizedContents chính xác. Chỉ cần ném này ra để hy vọng đốt cháy một số ý tưởng. –

+0

chỉ cần quan tâm ... tại sao bạn không di chuyển fakefield trên textentry để localizedContent và thả bảng textentry, wouldnt này đơn giản hóa những thứ mà không mất bất cứ điều gì. như sau đó bạn sẽ không phải đi qua một bảng liên kết .... mà tôi không thể nhìn thấy những gì nó cho biết thêm khác hơn fakefield ... có thể được di chuyển đến localizedContent ... – Seabizkit

+0

Nếu bạn muốn sử dụng các phương pháp EF bản địa, bạn sẽ kết thúc việc chặn các cây lệnh bằng API chặn mới của EF6. Nếu bạn làm điều đó, cuối cùng bạn sẽ tạo lại EntityFramework.DynamicFilters. Tôi sẽ đi cho gói Nuget. –

Trả lời

1

Lưu ý rằng nó không phải là hiện nay có thể để lọc mà liên quan thực thể được tải. Bao gồm sẽ luôn mang lại tất cả các thực thể có liên quan .

Msdn Reference

var result = dc.ExampleEntity1.Include(ee =>ee.TextEntry.LocalizedContents) 
       .Select(x=>new 
       { 
        //Try anonymous or a projection to your model. 
        //As this Select is IQuerable Extension it will execute in the data store and only retrieve filtered data. 
        exampleEntity = x, 
        localizedContetnt = x.TextEntry.LocalizedContents.Where(g=>g.Id==YourKey), 
       }).FirstOrDefault(); 

Bạn có thể thử anonymous projection để lọc nội dung trong các thực thể bao gồm

Entity đội khuôn khổ đang làm việc về vấn đề này bạn có thể bỏ phiếu của bạn here

Similar Answer

+0

Tôi nghĩ rằng trong EF rằng tất cả bao gồm phải được xác định .. tức là 'dc.ExampleEntity1.Include (ee => ee.TextEntry) .Include (ee => ee.TextEntry.LocalizedContents)' họ đã thêm khả năng này ở chỗ nó biết rằng nó cần bảng liniking để truy cập bảng LocalizedContents. – Seabizkit

-1

KHÔNG được thử nghiệm VÀ không hoàn hảo về hiệu suất do cách hoạt động bao gồm ... Tôi sẽ thực hiện theo cách thủ công nhưng đây là ví dụ về những gì bạn có thể làm.

var result = dc.ExampleEntity1 
      .Include(x => x.TextEntry) 
      .Include(x => x.TextEntry.LocalizedContents) 
      .Include(x => x.TextEntry.LocalizedContents.Local) 
      .Where(x => x.id == 'ExampleEntity1Key' 
         && x.TextEntity.LocalContent.Local.Id == 'Value' 
      ) 
      .FirstOrDefault(); 

Điều này sẽ kết thúc với đối tượng ExampleEntity1 với tất cả điều hướng được tải .... nơi Địa phương được khớp trên id.

sau đó bạn có thể nhận được các địa phương như ..

var listLocalsForExampleEnitity = result.TextEntry.LocalizedContents.Local.ToList(); 

hoặc chỉ cần gọi họ từ nơi nào như họ đã có trong mem.

Hope this helps

2

Nếu bạn muốn thực hiện việc lọc trong truy vấn cơ sở dữ liệu sau đó (như của EF6), bạn phải sử dụng Query method:

Phương pháp truy vấn cung cấp quyền truy cập vào các truy vấn cơ bản mà khung thực thể sẽ sử dụng khi tải các thực thể liên quan. Sau đó bạn có thể sử dụng LINQ để áp dụng bộ lọc để truy vấn trước khi thực hiện nó với một cuộc gọi đến một phương pháp khuyến nông LINQ như ToList, Load vv

using (var context = new BloggingContext()) 
{ 
    var blog = context.Blogs.Find(1); 

    // Load the posts with the 'entity-framework' tag related to a given blog 
    context.Entry(blog) 
    .Collection(b => b.Posts) 
    .Query() 
    .Where(p => p.Tags.Contains("entity-framework") 
    .Load(); 

    // Load the posts with the 'entity-framework' tag related to a given blog 
    // using a string to specify the relationship 
    context.Entry(blog) 
    .Collection("Posts") 
    .Query() 
    .Where(p => p.Tags.Contains("entity-framework") 
    .Load(); 
} 

Tuy nhiên, nhược điểm rõ ràng là bạn phải làm mỗi mục nhập này và mỗi cuộc gọi Load thực hiện truy vấn đối với cơ sở dữ liệu.

Trừ khi đó là điều kiện tiên quyết cho bạn, tôi sẽ chọn chỉ tải tất cả các bản địa hóa và chỉ cần lọc trong bộ nhớ để sử dụng ngôn ngữ đã chọn. Tôi khá chắc chắn hiệu suất sẽ không phải là một vấn đề.

+1

giá trị trong này ... lên 1 từ tôi. – Seabizkit

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