2015-10-05 71 views
0

我有兩個表格 - 產品和SKU,相關的一對多。獲取fk相關實體在id列表中不包含id的實體列表

我有第三個表,租金,其中包含已出租的sku ids。

產品有許多相關的SKU - 例如,產品1可能有SKU 1,2和3。

客戶租賃SKU產品。因此SKU 1可能沒有庫存,但庫存中仍有2個SKU,這意味着產品仍可用。

如果所有3個SKU均出租(位於出租表中),則該產品不可用。

我需要查詢庫存中剩餘SKU的產品的上下文。

我試圖通過獲取產品列表,不可用SKU列表以及返回SKU不在不可用SKU列表中的產品來完成此操作。

我的產品一個IQueryable ...

IQueryable<products> p = (from r in db.products from pc in r.productcategories 
where pc.categories.categoryname == n select r) 
.OrderByDescending(s => s.productname).Take(18); 

和不可用的SKU列表...

List<int> rentedskus = new List<int>(); 
rental = rental.Where(t => sd < t.enddate && t.startdate < ed); 

foreach (var r in rental) 
{ 
    rentedskus.Add(r.skuid); 
} 

事情馬虎這裏,但我從產品SKU列表我的產品清單...

List<products> plist = p.ToList(); 
List<int> productskus = new List<int>(); 
foreach(var pr in plist) 
{ 
    foreach(var sk in pr.sku) 
    { 
     productskus.Add(sk.skuid); 
    } 
} 

現在,假設這是一個可接受的方式來實現我的目標,我需要選擇只有那些相關SKU不在租賃的產品。我已經嘗試了幾個變體...

var productlistresult = productskus.Except(rentedskus).ToList(); 
p = p.Where(i => i.productlistresult.Contains(product.skus(n => n.skuid)); 

回答

1

你幾乎與你最後一個示例代碼一樣,你只是有一些邏輯錯誤。這是你所需要的:

p = p.Where(i => productlistresult.Contains(i.skuid)); 

此外,您還可以清理大幅度你的代碼,通過使用Select。例如,而不是創建一個列表,查詢租用的SKU,然後遍歷的SKU,並將它們添加到列表中,只是做:

var rentedskus = rental.Where(t => sd < t.enddate && t.startdate < ed).Select(t => t.skuid); 
+0

感謝克里斯。產品表沒有skuid。我只能通過sku表獲得skuid ... – tintyethan

+0

好的,那麼你只需要做一些像'i.skus.Any(s => productlistresult.Contains(s.skuid))''。 –

+0

完美 - 謝謝。 p = p.Where(i => i.sku.Any(s => productlistresult.Contains(s.skuid))); – tintyethan