我有以下行动方法: -
[AcceptVerbs(HttpVerbs.Post)]
public PartialViewResult Search(string q, int classid)
{
var users = r.searchusers(q, classid);
// code does here..............
调用以下模型存储库方法: -
public IQueryable<User> searchusers(string q, int id)
{
return from u in entities1.Users
where (!u.Users_Classes.Any(c => c.ClassID == id) && (u.UserID.Contains(q))
select u;
}
现在,如果我将IQueryable更改为IEnumerable,如下所示,在这种情况下查询将如何执行会有任何变化?: -
public IEnumerable<User> searchusers(string q, int id)
{
return from u in entities1.Users
where (!u.Users_Classes.Any(c => c.ClassID == id) && (u.UserID.Contains(q))
select u;
}
答案 0 :(得分:1)
是的,它会更改查询,您希望将IQuerable用于任何使用远程数据源的内容。
在你的情况下,它会强制linq执行查询,因为IQuerable会等到其他人执行查询。如果他们愿意,IQuerable允许他们附加更多条件来推送到数据库执行。
我通常在图层边界强制执行IEnumerable,我不想让人们修改系统要生成的查询。
答案 1 :(得分:1)
是的,在我的测试中,一旦你转换为IEnumerable,它就决定了查询SQL。之后执行的任何其他查询组合将在执行查询后在内存中完成。
假设您有一个基本查询,用于加载用户列表并返回IEnumerable。然后在实际运行该列表(从而执行查询)之前,还要添加.Where(i =&gt; i.username ='bob')。在这种情况下,它将执行整个select,然后在内存过滤器中为“where username ='bob'”部分应用LINQ-to-Objects,这可能不是你想要的,而是你想要整个事情来作为SQL语句的一部分运行。
所以是的,总是尽可能地使用IQueryable,以便立即运行完全合成。