LINQ在执行多个连接之前选择表的列

时间:2018-02-28 16:06:08

标签: linq

在运行下面的查询并在调试时将鼠标悬停在“usersToWork”上之后,除了与该值有关系的其他表外,我还可以查看我返回给我的单个条目的所有属性。我需要向用户显示的是“Lines.Id”(Lines是表,Id是Lines表中的列)值,但是该值会从SelectMany()语句中丢失。无论如何选择“Lines.Id”值以包含在我从所有连接中获得的最终值中?在下面的代码中,我注释了我想要的内容,但是我不能放在那里,否则我在第一个SelectMany语句中得到错误,说'int'不包含'Shifts'的定义而没有扩展方法'Shifts'接受a可以找到类型'int'的第一个参数。'

如果我错了,请纠正我,但SelectMany()选择您要加入的所有列。在这种情况下,在第一个SelectMany()中,我只得到“Shifts”表中的值,而在第二个SelectMany()中,我只得到“Users”表中的值。为什么这与SQL连接不同?加入SQL时,您可以在将每个列连接在一起时获取每个列,SelectMany()仅生成您要加入的第二个表的值。甚至可以在“Lines”表中获取该值,还是我必须进行另一个查询?任何帮助都会很棒。

int idEnteredByUser = 123;
var usersToWork = entityDataModel.Lines
                //....NOT IN MY CODE NOW....
                // .Select(line => line.Id)//THIS IS WHAT I NEED.
                // .Select(line => line.Description, line.Id//OR THIS TO RETURN TWO VALUES IF POSSIBLE

                //This is my current code, I need to include on of the select lines above.
                .SelectMany(line => line.Shifts) //Join lines on shifts.
                .Where(shift => shift.EndTime >= DateTime.Now) //Join restricted times.
                .SelectMany(user => user.Users) //Join the restricted shift times on users.
                .Where(user => user.UserId == idEnteredByUser ); //Only look for the specific user

1 个答案:

答案 0 :(得分:1)

使用LINQ查询语法可以更轻松。

我假设您在发布的代码中输入了拼写错误,而user属于shift的属性。

var idEnteredByUser = 123;
var usersToWork = 
    from line in entityDataModel.Lines
    from shift in line.Shifts
    where shift.EndTime >= DateTime.Now
    from user in shift.Users
    where user.UserId == idEnteredByUser
    select new
    {
        Description = line.Description,
        Id = line.Id
    };