c# - 返回 IQueryable 或枚举对象

标签 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;
    }
}

提前致谢。

最佳答案

好吧,我能看到的主要区别是何时执行查询以及您可以对查询执行的其他操作。

例如,假设您的 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 比我可以从中获取数据的查询更容易。另一方面,它的灵 active 稍差。

一个选项是允许两者 - 具有 GetCurrentCustomerQuery() 和 GetCurrentCustomer() 方法。 (我可能不会自己制作它们的属性,但这只是个人喜好的问题。)这样你就可以在你真正需要的时候获得你想要的灵 active ,但是有一个简单的方法来将当前客户作为一个对象.

关于c# - 返回 IQueryable 或枚举对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2590246/

相关文章:

c# - 为什么我的动态 IEqualityComparer 不起作用?

c# - IQueryable 命令超时

c# - IQueryable 的结构是什么?

c# - 更新 Visual Studio 中的数据集结构以匹配新的 SQL 数据库结构

c# - 如何为这种情况编写 StructureMap 扫描器

c# - ExecuteSqlCommand并行执行

c# - LINQ to Entities 跳过并采取

c# - NAudio效果不起作用,并且在不同的声卡上的行为不同

c# - 使用 c# 桌面应用程序编写脚本

c# - 如何使用 LinQ 获取 IQueryable() 而不是 List()?