2

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

为简化起见,我有两个表(这些表映射到 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()or .ToList()。我只希望x(从上面的示例)通过使用返回 1 个字符串.Take(1)。如果我追加ToList()到我的第一个查询的末尾,我需要在我的第二个查询中使用 x[0]。这似乎是一种混乱的做事方式。当您知道只有 1 个结果时,是否有更好的方法来强制执行查询?

4

1 回答 1

5

如果我理解您的问题,您是否正在尝试以连接模型为条件?

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

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

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

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

于 2012-12-03T23:00:48.207 回答