2015-12-10 28 views
0

我正在使用LINQ to SQL來處理項目中的服務。我涉及三個實體:PCodePurchaseOrder的財產,以及與User的M:N。檢查單個元素是否在LINQ中的列表中,當首先提供單個元素時

PCode (M:N) User 
PCode (1:M) PurchaseOrder 

該服務爲PurchaseOrder,因此正在查詢表。因此,使用.Where()需要p => p.PCode開始使用該值。我知道.Contains()和其他類似的命令,但它們都要求列表先出現,而我不能用這種查詢來完成。我最終需要檢查特定PurchaseOrder中的PCodeId是否在與當前用戶關聯的PCodeId列表中。我如何在LINQ to SQL中過濾這種方式?我覺得這很簡單,我無法弄清楚。

簡體User類:

public partial class User 
{ 
    public virtual int Id { get; set; } 
    public virtual ICollection<PCode> PCodes { get; set; } 
} 

PCode

public partial class PCode 
{ 
    public virtual int Id { get; set; } 
    public virtual ICollection<User> Users { get; set; } 
} 

PurchaseOrder

public partial class PurchaseOrder 
{ 
    public virtual int Id { get; set; } 
    public virtual int PCodeId { get; set; } 
} 

查詢的起點。:

// list to be searched can either be passed into the function 
// or retrieved via navigation property when the query runs, either works 

var query = _poRepository.Table; 
if (condition) 
    // query = query.Where(?); 
    // query = query.Where(p => p.PCode ... ?); 
+1

你想要什麼? –

+0

@RobertMcKee剛纔在問題中澄清說,對不起。我最終需要檢查特定'PurchaseOrder'中的'PCodeId'是否在與當前用戶關聯的'PCodeId'列表中。 – vaindil

回答

1
var CurrentUser=db.Users 
    .Include(u=>u.PCodes) 
    .Where(u=>u.id==something); 
if (CurrentUser.PCodes.Any(pc=>...)) 

您還採購訂單上缺少的導航性能,和P碼:

public partial class PurchaseOrder 
{ 
    public int Id { get; set; } // Should not be virtual 
    public int PCodeId { get; set; } // Should not be virtual 
    public virtual PCode PCode { get; set; } // new Navigation 
} 
public partial class PCode 
{ 
    public int Id { get; set; } // Should not be virtual 
    public virtual ICollection<User> Users { get; set; } 
    public virtual ICollection<PurchaseOrders> PurchaseOrders { get; set; } // new Navigation 
} 

或者相反:

var po=db.PurchaseOrders 
    .Include(po=>po.PCode) 
    .Include(po=>po.PCode.Users) 
    .First(po=>po.id==someid); 

if (po.PCode.Users.Contains(currentUser)) ... 
or 
if (po.PCode.Users.Any(u=>u.id==someuserid)) ... 

,或者如果你已經是一個用戶ID和POID:

if (db.PurchaseOrders.Any(po=>po.id==poid && po.PCode.Users.Any(u=>u.id==userid))) ... 
+0

這是完美的,謝謝!我完全忘了'PlannerCode'上的'User'的導航屬性,這會讓它更容易。我去'(po.PCode.Users.Any(u => u.id == someuserid))',我認爲這是最簡單的實現。謝謝! – vaindil

相關問題