简体   繁体   English

使用与LINQ的SQL IN函数等效的集合

[英]Using the equivalent to the SQL IN function with LINQ with a collection

How do I translate the following in LINQ? 如何在LINQ中翻译以下内容?

SELECT DISTINCT w.Worker_ID, w.Surname, w.FirstName, ps.JobNumber
FROM Worker w, ProjectSignatory ps
where w.Worker_ID = ps.Worker_ID
and ps.JobNumber 
IN 
    (SELECT DISTINCT pa.JobNumber
    FROM Worker w, PAAFRegister pa
    where w.Worker_ID = pa.Worker_ID
    and w.Worker_ID = @UserX)

I have seen anumber of posts which sugges that the .Contains function is a good idea, however since I am looking through a collection of results then based from what I have seen on other responses LINQ does not like it when people call .Contains on a collection. 我已经看到一些帖子暗示.Contains函数是一个好主意,但是因为我正在查看结果集合,然后根据我在其他响应中看到的内容LINQ在人们调用时不喜欢它.Contains on a采集。

I am trying to understand the workings of LINQ on the whole. 我试图从整体上理解LINQ的工作原理。 I am relatively inexperienced. 我相对缺乏经验。 Any advice would be greatly appreciated. 任何建议将不胜感激。

EDIT: I have seen a few approaches and I am wondering if the following is a good start or would it be best achieved using a linge query using joins? 编辑:我已经看到了一些方法,我想知道以下是一个良好的开端还是最好使用连接的链接查询实现?

var sig = from w in db.Workers
          join ps in db.ProjectSignatories
              on w.Worker_ID equals ps.Worker_ID
          select ps;

var paaf = from w in db.Workers
           join pa in db.PAAFRegisters
               on w.Worker_ID equals pa.Worker_ID
           where w.Worker_ID == workerID
           select w;

I am aware that this is incomplete and seves no purpose or makes no sense to what I am attempting to achieve. 我知道这是不完整的,没有任何目的或对我试图实现的目标毫无意义。 This was merely an example based on previous posts I have seen and wondering if the approach is suitable. 这仅仅是基于我以前发过的帖子的一个例子,并且想知道这种方法是否合适。

Thanks! 谢谢!

You're looking for the .Contains() function. 你正在寻找.Contains()函数。

  1. First build up the inner filter set section of the query. 首先构建查询的内部过滤器集部分。

    EG: The part that goes in the .Contains() (in SQL terms the " ps.JobNumber IN (...) " ) EG: .Contains() (用SQL术语表示“ ps.JobNumber IN (...) ”)

  2. Filter your query by the new data subset by using the .Contains function. 使用.Contains函数按新数据子集筛选查询。

Example: 例:

C# SQL-like syntax: C#类SQL语法:

var subSet = select JobNumber 
               from Workers 
              where Worker_ID == "UserX";

var result = select JobNumber 
               from Workers 
              where subSet.Contains(jobnumber);

LINQ chaining: LINQ链接:

var subSet = Workers.Where(o => o.Worker_ID == "UserX")
                    .Select(o => o.JobNumber)
                    .Distinct();

var result = Workers.Where(o => subSet.Contains(o.JobNumber)).ToList();

You can create subselect's in LINQ. 您可以在LINQ中创建子选择。

var jobNumbers = select JobNumber from Workers where <your criteria, joins>
var myResult = select JobNumber from Workers where <your criteria, joins> and jobNumbers.Contains(JobNumber)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM