2010-07-18 112 views
2

我有我正努力在LINQ語句轉換SQL語句...LINQ - SELECT DISTINCT與NOT IN

SELECT DISTINCT mc.* 
    FROM ManufractorCategories mc 
WHERE mc.Active = 'true' 
AND mc.Folder = 'false' 
AND (mc.Id not in (SELECT Category_id FROM Manufractor_Category 
         WHERE Manufractor_id = 3)); 

這是我的最後,不工作LINQ聲明

(IQueryable<object>)db.ManufractorCategories 
       .Where(o => o.Active == active) 
       .Where(o => o.Folder == folder) 
       .Select(i => new { i.Id, i.Folder }).Except(db.Manufractor_Categories.Where(t => t.Manufractor_id == id).Select(t => new { t.Category_id })).Distinct(); 

我已經嘗試了整個星期日,但Except語句不起作用。

感謝您的幫助!

回答

4

Except方法需要兩組相同的類型 - 這意味着您必須在嵌套查詢和外部查詢中選擇類型爲ManufractorCategory的對象,然後選擇第一個所有類別一個而不是第二個。

更簡單的替代方法是使用Contains方法檢查當前ID是否在要過濾的ID列表中。下面應該工作:

var q = 
    db.ManufractorCategories 
    .Where(o => o.Active == active) 
    .Where(o => o.Folder == folder) 
    .Select(i => new { i.Id, i.Folder }) 
    .Where(o => 
     !db.Manufractor_Categories 
      .Select(t => t.Manufractor_id) 
      .Contains(o.Id) 
    .Distinct(); 

而且使用的查詢語法的簡化版本:

var q = 
    from o in db.ManufractorCategories 
    where o.Active == active && o.Folder == folder && 
     db.Manufractor_Categories 
      .Select(t => t.Manufractor_id) 
      .Contains(o.Id) 
    select new { i.Id, i.Folder }; 
0

Except語句將獲得與Category_id屬性的對象的列表。但是,查詢的結果包含具有IdFolder屬性的對象。查詢很可能無法看到這些對象的位置是否相等,因此Except子句不會生效。