【问题标题】:Exists query with LINQ存在使用 LINQ 的查询
【发布时间】:2015-02-06 03:41:28
【问题描述】:

我想用 LINQ 获得一个员工列表,这些员工必须在 TypeOfWorks 列表中有 typeofWork 在参数中传递 (Id)

  public class Employee 
    {   
        public virtual IList<EmployeeTypeOfWork> TypeOfWorks { get; set; }
    }

    public class EmployeeTypeOfWork 
    {
        public virtual Guid Id { get; set; }
        public virtual Employee Employee { get; set; }
        public virtual TypeOfWork TypeOfWork { get; set; }
    }

    public class TypeOfWork 
    {
        public virtual Guid Id { get; set; }
    }

    public IList<Employee> ListWithTypeOfWork(IList<Employee> Employees, 
Guid typeOfWorkId)
    {     
        ?????       
    }

我试过了,但我错过了一些我认为的东西

        var res = from p in Employees
        where (from pp in p.TypeOfWorks 
    where pp.TypeOfWork.Id == guid select pp.Id).Contains(p.Id)
        select p;

【问题讨论】:

    标签: c# .net linq


    【解决方案1】:

    试试下面的

    var res = Employees
      .Where(x => x.TypeOfWorks.Any(w => w.Id == guid))
    

    【讨论】:

    • 为什么不用Any 替换Where 以便缩短它? :)
    • @Ryan,好电话。我忘记了 Any 的重载,它接受谓词。
    • 如果其中一个 TypeOfWorks 为 null,则代码将抛出异常。
    • @blesh,是的,但表示集合中缺少值的最佳方法是使用空集合。拥有一个空集合只会使使用集合的代码复杂化
    • @blesh,将 null 放入任何类型的集合有什么价值?拥有这样的值会添加 0 个有用信息,而会添加不可用的信息。那将是代码中的错误,而不是我的答案。
    【解决方案2】:
    public IEnumerable<Employee> ListWithTypeOfWork(IList<Employee> Employees, Guid typeOfWorkId)
    {     
        return from emp in Employees
            where emp.TypeOfWorks.Any(x => x != null && x.Id == typeOfWorkId)
            select emp;          
    }
    

    【讨论】:

    • 谢谢布莱什。与我的问题 100% 匹配,您能否将 where 子句更正为: where emp.TypeOfWorks.FirstOrDefault(x => x != null && x.TypeOfWork.Id == guid) != null
    • 仅供参考,当我问 Linq 代码为什么每个人都用 lambda 表达式回答时,有什么具体原因吗?
    • @Kris-l: FirstOrDefault(Func) 和 Any(Func) 几乎是完全相同的方法调用,您可以在 Reflector 中查看。唯一的区别是 FirstOrDefault(Func) 返回一个对象,而 Any(Func) 只返回一个布尔值。当您只是测试引用类型列表时,返回 bool 会稍微高效一些。如果您正在测试值类型列表,那么我认为这并不重要,但返回 bool 可能仍然更有效。
    猜你喜欢
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 2018-08-14
    • 2014-05-26
    • 2012-01-29
    • 1970-01-01
    • 2023-03-22
    相关资源
    最近更新 更多