2010-07-18 90 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子句不会生效。