返回IQueryable或枚举对象

时间:2010-04-07 05:42:44

标签: c# linq iqueryable

我想知道这两种情况之间的性能差异以及相互之间的缺点是什么?

第一种情况:

public class Helper //returns IQueryable
{
   public IQueryable<Customer> CurrentCustomer
   {
      get{return new DataContext().Where(t=>t.CustomerId == 1);
   }
}

public class SomeClass
{
    public void Main()
    {
       Console.WriteLine(new Helper().CurrentCustomer.First().Name;
    }
}

第二种情况:

public class Helper //returns Enumerated result
{
   public Customer CurrentCustomer
   {
      get{return new DataContext().First(t=>t.CustomerId == 1);
   }
}

public class SomeClass
{
    public void Main()
    {
       Console.WriteLine(new Helper().CurrentCustomer.Name;
    }
}

提前致谢。

3 个答案:

答案 0 :(得分:4)

嗯,我能看到的主要区别在于执行查询以及您可以对查询执行的其他操作。

例如,假设您的Customer对象有一些大字段。使用第二种方法,您将始终获取它们。使用可以写的第一种方法:

string name = helper.CurrentCustomer.Select(x => x.Name).First();

然后只需要查询数据库中的单个字段。在计时方面,查询只会在您实际请求数据时执行(这是在您使用Select计算出在上述情况下放入查询的内容之后能够等待的时间) 。这有利有弊 - 它可以使其更难以推理,但它也可以节省一些工作。就“推理”方面而言,您知道,一旦您拥有了客户,您就拥有了一个可以与之合作的对象。如果你使用相同的可查询两次,你需要知道你的LINQ查询提供程序是否要缓存结果...如果你写:

IQueryable<Customer> currentCustomerQuery = helper.CurrentCustomer;
Customer x = currentCustomerQuery.First();
Customer y = currentCustomerQuery.First();

会发出一次或两次查询吗?我怀疑这很大程度上取决于提供商,但我不想对具体的做出任何猜测。

要考虑的另一件事是使用您正在构建的API是多么容易。就个人而言,我通常会发现使用API​​可以更容易地为我提供我想要的数据,而不是我可以从中获取数据的查询。另一方面, 的灵活性稍差。

一种选择是允许两者 - 拥有GetCurrentCustomerQuery()和GetCurrentCustomer()方法。 (我可能不会自己制作这些属性,但这只是个人偏好的问题。)这样你可以在你真正需要时获得你想要的灵活性,但是有一种简单的方法可以让当前客户成为一个对象

答案 1 :(得分:0)

简而言之,使用IQueryable要好得多,并且允许您在路径中进一步过滤返回的IQueryable,而不会将对象或集合实际加载到内存中。在这种情况下,返回类型是一个简单的Customer类,影响很小,但是在集合的情况下,强烈建议您使用IQueryable。 Chris Sells更深入地展示了这个问题here

答案 2 :(得分:0)

方法之间的区别在于第一个返回一个可以返回对象的表达式,第二个表达式已经执行了表达式并返回了对象。

在这个确切的场景中,差异并不是很有用,并且将单个对象作为表达式返回并不是非常直观。

如果您有一个返回多个对象的方法,那么差异更有用的场景。延迟执行表达式意味着您只会加载实际使用的对象。如果您只需要前几个对象,则不会创建其余对象。