【问题标题】:Asp.net core webapi entityframework how to query distinct and not inAsp.net core web api实体框架如何查询distinct而不是in
【发布时间】:2021-12-08 02:42:47
【问题描述】:

我有以下 sql 查询,并想在 entityframework linq 中编写。谁能帮我写这个。基本上我想要一个表中的唯一标签名称,并且还没有为给定的用户添加。

预期的 sql 查询:

SELECT DISTINCT(source.tagName) tagName FROM [dbo].[UserTag] source
WHERE source.tagName IS NOT NULL AND source.tagName NOT IN (
  SELECT tagName FROM [dbo].[UserTag] WHERE userid=87 AND tagName IS NOT NULL
)

当前 linq 查询:

var list = await _context.UserTag
            .AsNoTracking()
            .Where(userTag => userTag.TagName != null && !userTag.Disabled)
            .Select(userTag => userTag.TagName)
            .OrderBy(tagName => tagName)
            .Distinct()
            .ToListAsync();

【问题讨论】:

  • 您的 Linq 给出的结果是否与 SQL 查询不同?在我看来你的 LINQ 很好

标签: c# entity-framework linq-to-entities


【解决方案1】:

您可以使用“不在”除外

var answer = list1.Except(list2);

例如在你的代码中,你可以这样写:

var blackList = await _context.UserTag
            .AsNoTracking()
            .Where(userTag => userTag.TagName != null && !userTag.Disabled && userTag.userid = 87)
            .Select(userTag => userTag.TagName)
            .Distinct()
            .ToListAsync();

var list = await _context.UserTag
            .AsNoTracking()
            .Where(userTag => userTag.TagName != null)
            .Select(userTag => userTag.TagName)
            .OrderBy(tagName => tagName)
            .Distinct()
            .ToListAsync();

var finalList = list.Except(blackList);

第二种方法:

var blackList = _context.UserTag
            .AsNoTracking()
            .Where(userTag => userTag.TagName != null && !userTag.Disabled && userTag.userid = 87)
            .Select(userTag => userTag.TagName);

var list = _context.UserTag
            .AsNoTracking()
            .Where(userTag => userTag.TagName != null)
            .Select(userTag => userTag.TagName)
            .OrderBy(tagName => tagName)
            .Distinct();

var finalList = await (list.Except(blackList)).ToListAsync();;

第三种方法;

var query =    
    from u in _context.UserTag   
    where !(from uu in _context.UserTag 
            where uu.TagName != null && uu.userid = 87)
            select uu.TagName)    
           .Contains(u.TagName)    
    select u.UserTag;

var finalList = query.OrderBy(tagName => tagName)
            .Distinct()
            .ToListAsync();

【讨论】:

  • 谢谢。但是在这种情况下,数据库被命中两次才能得到结果,对吗?有没有办法用作单个查询
  • @MukilDeepthi 我认为“Except”也适用于 IQueryable,我在答案中编写了一个示例代码来测试它,您也可以编写一个链接查询作为替代方法
  • @MukilDeepthi 查看第三种方法
  • 第三个答案有效。谢谢
【解决方案2】:

也可以使用Contains()方法实现:

var exceptionList = (from source in _context.UserTag
            where source.userid.Equals(87) && source.tagName!=null)
            order by source.tagName
            select source.tagname).Distint();

var result = from source in _context.UserTag
        where source.tagname != null && (!exceptionList.Contains(source.tagname != null))
        order by source.tagname
        select source.tagname).Distint();   

【讨论】:

    猜你喜欢
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 2019-04-10
    • 2018-05-01
    相关资源
    最近更新 更多