我正在通过在线视频教程学习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个结果时,是否有更好的方法强制执行查询?
答案 0 :(得分:3)
如果我理解你的问题,你是否试图对已加入的模型进行条件化?
var query = db.Users.Where(x => x.Addresses.Where(y => y.Value >= yourValue).Any());
这将返回属性值大于yourValue
的所有用户。如果您需要使用查询返回地址,则只需向查询中添加Include
即可。例如:
query.Include(x => x.Addresses);
您无需手动执行示例中的Join
。