c# - LINQ - 使用 NOT IN 选择 DISTINCT

标签 c# linq distinct

我有一个 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 语句不起作用。

在此先感谢您的帮助!

最佳答案

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 };

关于c# - LINQ - 使用 NOT IN 选择 DISTINCT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3276616/

相关文章:

c# - 将自定义实体映射到数据库列

c# - 避免在部分 View 中授权

c# - 当行具有空值时, Entity Framework 返回空对象

MYSQL DISTINCT 关键字不起作用

sql - 仅使用 SQL 计算一对多关系中的子记录数

c# - 防止窗口显示在 alt 选项卡中

c# - 我可以为此使用什么数学模型以及如何在 c++/c# 中实现它

c# - 如何使用属性过滤 Xml 文件?

c# - IQueryable 和计数

c# - 使用附加条件进行不同的 Linq 过滤