Linq Extension方法用于Join

时间:2012-12-03 21:59:22

标签: c# asp.net-mvc linq entity-framework

我正在通过在线视频教程学习LINQ,ASP.NET,EF和MVC。我希望能帮助理解LINQ扩展方法语法中的Joins。

为简化起见,我有两个表(这些表映射到SQL DB):

User Table:
    public int userID{get;set;}
    public string firstName{get;set;}
    ...

Address
    public int ownerID{get;set;}
    public int value{get;set;}
    public string Nickname{get;set;}
    public string street{get;set;}
    public string zip{get;set;}
    ...

假设我想查找特定用户拥有的所有属性。我相信我可以这样做:

var test = db.User
    .Join(db.Address, user => user.userID, add => add.ownerID, (user, add) => new { user, add });
Source: http://byatool.com/c/linq-join-method-and-how-to-use-it/

这应该相当于

SELECT * FROM User a JOIN Address b on a.userID = b.ownerID 

请确认这是正确的。

现在,如果我想查找特定用户拥有value greater than x的所有属性,该怎么办?让我们更进一步说x是另一个LINQ查询的结果。如何在第二个查询中强制执行x?我甚至不得不考虑这个问题,还是LINQ知道在这种情况下该做什么?

由于

编辑: 当我尝试将查询结果用作另一个查询的结果时,我需要使用贪婪的运算符来强制执行。许多人喜欢使用.Count().ToList()。我只希望x(来自上面的示例)使用.Take(1)返回1个字符串。如果我将ToList()附加到第一个查询的末尾,我需要在第二个查询中使用x [0]。这似乎是一种乱七八糟的做事方式。当您知道只有1个结果时,是否有更好的方法强制执行查询?

1 个答案:

答案 0 :(得分:3)

如果我理解你的问题,你是否试图对已加入的模型进行条件化?

var query = db.Users.Where(x => x.Addresses.Where(y => y.Value >= yourValue).Any());

这将返回属性值大于yourValue的所有用户。如果您需要使用查询返回地址,则只需向查询中添加Include即可。例如:

query.Include(x => x.Addresses);

您无需手动执行示例中的Join