2012-07-30 8 views
5

Tôi có 3 mô hình tên:C# LINQ to Entities truy vấn cho các giao điểm của hai thuộc tính khác nhau

Pencil có Pencil.Id (int) và Pencil.Colors (IEnumerable) Sở hữu

Bút có thuộc tính Pen.Id (int) và Pen.Colors (IEnumerable)

Màu sắc có Id và tên.

Pencil có một mối quan hệ với nhiều màu sắc (nhiều-nhiều) Pen có một mối quan hệ với nhiều màu sắc (nhiều-nhiều)

Tôi muốn xây dựng một truy vấn mà sẽ chỉ cho tôi cùng một màu bút chì cho cây bút mà tôi đang cầm.

Tôi đang sử dụng dưới đây LINQ-to-Đối tượng truy vấn:

int id = id_of_the_pen_that_i_am_holding; 
Pen p = db.Pens.Find(id); 
var list = from m in db.Pencils where m.Colors.Intersect(p.Colors) != null select m; 

mô hình Màu sắc là IEnumerable vì vậy nó có nhiều hơn 1 màu. Ví dụ; bút có 15 màu khác nhau và bút chì có 25 màu khác nhau. Tôi muốn mang bút chì corresonding nếu một trong những màu sắc của cây bút mà tôi đang cầm cũng có thể dùng được trong bảng màu của cây bút chì đó.

Nhưng tôi nhận được ngoại lệ để sử dụng các biến thông thường như int hoặc chuỗi thay vì đối tượng.

Tôi có thể làm gì? Cảm ơn trước sự giúp đỡ của bạn.

EDITED: tôi đã tạo ra một câu hỏi mới cho một vấn đề tiếp theo có thể: C# LINQ to Entities- Properties on the intersection of an object and a collection of objects

+0

bạn chưa kết thúc phức tạp này? Hãy suy nghĩ trở lại SQL đơn giản (đó là những gì truy vấn của bạn sẽ được chuyển đổi sang anyway) có thể bạn không thay vì chỉ nói từ m trong db.Pencils nơi m.Color = p.Màu chọn m? –

+0

Mô hình màu là IEnumerable nên nó có nhiều hơn 1 màu. Ví dụ bút có 15 màu khác nhau và bút có 25 màu khác nhau. Tôi muốn xem nếu một trong những màu sắc của cây bút cũng là avaialable trong quy mô màu của bút chì. – MrGorki

+0

Nếu thuộc tính màu của bạn là số đếm, thì có thể tên 'Màu sắc' hoặc' Bảng màu 'sẽ mô tả rõ hơn ý định của nó. –

Trả lời

6
int id = id_of_the_pen_that_i_am_holding; 
Pen p = db.Pens.Find(id); 
var penColorIds = p.Color.Select(m => m.Id).ToList(); 
var list = db.Pencils.Where(pencil => pencil.Color.Any(color => penColorIds.Contains(color.Id)); 
+0

Nó hoạt động như một sự quyến rũ! Cảm ơn Raphael – MrGorki

+0

Xin chào Raphael. Làm thế nào về việc nhận được danh sách các màu sắc trong giao lộ? Tôi sẽ đánh giá cao nếu bạn có một giải pháp cho điều này cũng có. – MrGorki

+0

Tôi vừa tạo một câu hỏi mới cho vấn đề này: http://stackoverflow.com/questions/11760499/c-sharp-linq-to-entities-properties-on-the-intersection-set – MrGorki

0

gì về đơn giản hóa mã của bạn và làm nó theo cách này, tôi biết nó không phải là đặc biệt thanh lịch nhưng tôi m không chắc chắn (ra khỏi đỉnh đầu của tôi) liệu LINQ có đẹp cách làm những gì bạn muốn:

IList<Pencil> sameColorPencils = new List<Pencil>(); 

Pen p = db.Pens.Find(id); 

foreach (Color color in p.Color) 
{ 
    var pencils = from pencil in db.Pencils 
        where pencil.Color == color 
        select pencil; 

    foreach (Pencil pencil in pencils) 
    { 
     if (sameColorPencils.Count(e => e.Id == pencil.Id) == 0) 
     { 
      sameColorPencils.Add(pencils); 
     } 
    } 
} 
+0

Cảm ơn! Đó là một cách tiếp cận tốt nhưng tôi không biết liệu hiệu suất của nó có đủ tốt hay không. Nó có vẻ hợp lý nhưng tôi thích một truy vấn LINQ trực tiếp hơn là vòng lặp. – MrGorki

+0

@MrGorki không thành vấn đề, câu trả lời được chấp nhận là một ý tưởng tuyệt vời vì vậy tôi cũng đã học được từ điều đó! –