将IQueryable用于DbSet

时间:2015-03-31 11:06:07

标签: c# asp.net-mvc-5 entity-framework-6 iqueryable dbset

我正在编写一个MVC 5互联网应用程序,并对使用IQueryable有疑问。

如果我将一组DbSet对象检索为IQueryable,并且我没有引用每个DbSet对象中的某些属性,那么在使用IQueryable时是否会检索这些属性的值?这是使用IQueryable而不是IEnumerable的优势吗?

我正在尝试确定从多个DbSet对象中检索值的最有效方法,其中我没有引用每个DbSet对象中的每个属性。

提前致谢。

修改

在这种情况下怎么样:

如果我的模型如下:

public class TestModel
{
    [Key]
    public long Id { get; set; }
    public string name { get; set; }
    public string value { get; set; }
}

我按如下方式检索上述对象的DbSet:

IQueryable<TestModel> testModels = await db.testModels(t => t.name.Equals("Test"));

我遍历上面的IQueryable,检索name属性,是从数据库中检索到的Idvalue值吗?

EDIT2

在这种情况下怎么样:

如果我将一些TestModel检索为IQueryable,然后遍历它们,那么调用IQueryable具有相同名称的完全相同的代码,是否对数据库进行了两次交易?

1 个答案:

答案 0 :(得分:0)

如果对数据库执行请求,则它将检索指定对象的所有属性。在这种情况下,将填充TestModel上的所有属性。使用IQueryable优于IEnumerable的好处是您可以使用LINQ扩展方法,例如WhereSelect等,您也可以在LINQ语句中使用DbSet,即:

from x in dbSetVariable where id == 1 select x

例如,您可以尝试的一件事是:

from x in DbSetVariable select new { newName = x.name }

这将创建一个名为newName的单个属性的匿名对象,并将使用name列中的数据填充该对象。这可能会导致请求单个列的查询。如果您想要请求其他单个列,则只需将新属性添加到匿名类型:

from x in DbSetVariable select new { newName = x.name, newValue = x.value }