我有限定有User
和Product
實體如下:的LINQ投影DTO嵌套/分層集合
public class User {
Guid Id { get; set; }
Guid ParentId { get; set; }
ICollection<Product> PermittedProducts { get; set; }
ICollection<User> Children { get; set; }
}
public class Product {
int Id { get; set; }
string Name { get; set; }
ICollection<User> PermittedUsers { get; set; }
}
從概念上講,Product
有PermittedUsers
的集合 - 即可以購買該產品的用戶。另外,每個User
都有一個PermittedProducts
的集合,以及一組兒童用戶,他們也有自己的PermittedProducts
集合。
我需要通過存儲庫運行查詢以返回產品列表。該庫的方法和DTO定義爲:
public ICollection<ProductListDto> GetProductsForUser(Guid userId) {
// Linq query here
}
public class ProductListDto {
int Id { get; set; }
string Name { get; set; }
ICollection<User> Users { get; set; }
}
信息庫方法需要採取一個GUID userId
和檢索該用戶的PermittedProducts
和的PermittedProducts
用戶的孩子。
例如,如果產品適用於用戶及其兩個子女,則ProductListDto將擁有其用戶集合中的所有三個用戶。作爲進一步的例子,如果產品對於用戶不可用,但是它可用於他的孩子,那麼這也需要被返回。
無論是Product
和User
可作爲總根,所以我可以使用一個ProductRepository
或UserRepository
查詢通過,通過的EntityFramework的DbSet
。
此刻我的倉庫方法是在UserRepository
(但可以移動到ProductRepository
如果查詢是簡單),看起來像:
public ICollection<ProductListDto> GetProductsForUser(Guid userId) {
// Linq query here - Set is the EF DbSet<User>
var products = from u in
Set.Where(x => x.Id == userId) //.... NOT SURE ABOUT THE REST!
}
我的問題是我不知道如何寫的Linq查詢來實現我需要做的事情!
編輯
的答案至今沒有解決如何實現投影到ProductListDto
嗨格雷厄姆。你確定你想以這種方式將這兩樣東西結合在一起嗎?你說他們都是聚合根源,對我來說這意味着他們是單獨的擔憂? –
不幸的是,我必須這樣做。實際上,它基於UserId(或UserIds列表)檢索產品列表。 – Graham
如果你**真的** **真的**想要這樣做,它會像這樣: context.Products.Include(p => p.PermittedUsers).Where(p => p.PermittedUsers.Any( u => u.Id == userId)); 這應該讓你得到一個用戶的產品列表。 –