Tôi có hai bảng cơ sở dữ liệu Liên hệ (Id, Tên, ...) và ContactOperationalPlaces (ContactId, MunicipalityId), nơi một liên hệ có thể được kết nối với một số ContactOperationalPlaces.Làm thế nào để thêm mệnh đề where vào linq join (lambda)?
Điều tôi đang cố gắng làm là tạo truy vấn (ASP .NET, C#) với IQueryable, chỉ chọn tất cả các liên hệ tồn tại trong bảng ContactOperationalPlaces, với một đô thị đã cho.
Truy vấn sql trông như thế này:
select * from Contacts c
right join ContactOperationPlaces cop on c.Id = cop.ContactId
where cop.MunicipalityId = 301;
Với LINQ nó sẽ giống như thế này:
//_ctx is the context
var tmp = (from c in _ctx.Contacts
join cop in _ctx.ContactOperationPlaces on c.Id equals cop.ContactId
where cop.MunicipalityId == 301
select c);
Vì vậy, tôi biết làm thế nào để làm điều này nếu điểm là để chọn tất cả điều này cùng một lúc, tiếc là nó không phải. Tôi đang xây dựng một truy vấn dựa trên đầu vào của người dùng, vì vậy tôi không biết tất cả các lựa chọn cùng một lúc.
Vì vậy, đây là những gì mã của tôi trông giống như:
IQueryable<Contacts> query = (from c in _ctx.Contacts select c);
//Some other logic....
/*Gets a partial name (string nameStr), and filters the contacts
so that only those with a match on names are selected*/
query = query.Where(c => c.Name.Contains(nameStr);
//Some more logic
//Gets the municipalityId and wants to filter on it! :(how to?
query = query.where(c => c.ContactOperationalPlaces ...........?);
Sự khác biệt với hai nơi báo cáo là với người đầu tiên, mỗi lần tiếp xúc chỉ có một tên, nhưng với sự sau một số liên lạc có thể chứa một số các địa điểm hoạt động ...
Tôi đã tìm được một giải pháp, nhưng giải pháp này mang lại cho tôi một đối tượng không được xác định, chứa cả hai bảng. Và tôi không biết làm thế nào để tiếp tục với nó.
query.Join(_ctx.ContactOperationPlaces, c => c.Id, cop => cop.ContactId,
(c, cop) => new {c, cop}).Where(o => o.cop.municipalityId == 301);
Đối tượng trở về từ biểu thức này là System.Linq.Iqueryable < {c: Liên hệ, cảnh sát: ContactOperationalPlace}>, và nó không thể được đúc vào Danh bạ ...
Vì vậy, đó là vấn đề. Câu trả lời có lẽ khá đơn giản, nhưng tôi không thể tìm thấy nó ...
và có lẽ thêm biệt() cho tiếp xúc –
Cảm ơn điều chỉnh. –
Cảm ơn bạn rất nhiều! Tôi biết rằng giải pháp sẽ khá đơn giản khi tôi tìm thấy nó. – linnkb