LINQ - 使用NOT IN的SELECT DISTINCT

3

我有一条SQL语句,现在想将其转换成LINQ语句...

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语句无法工作。

感谢您的任何帮助!

2个回答

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 子句将不起作用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接