代码之家  ›  专栏  ›  技术社区  ›  Josh Anderson

1000多个Linq查询或数据库中的逻辑…哪个更糟?

  •  3
  • Josh Anderson  · 技术社区  · 15 年前

    我问这个问题的时候有点奇怪 much more long-winded way a few days ago

    我必须根据用户分配给特定客户的任务来决定显示什么。域对象看起来像这个大大简化的示例:

    public class Customer
    {
        public string Name { get; set; }
        public IEnumerable<Users> AssignedUsers { get; set; }
    }
    

    domain-driven design (DDD)原则。另外,我还使用linqtosql进行数据访问。在我的服务层中,我向请求客户列表的用户提供信息,现在大约有1000个条目,每月增长2%。

    如果我严格要求在我的服务层中保留逻辑,我将需要使用Linq来执行 .Where 评估 AssignedUsers list包含请求列表的用户。这将导致对每个 Customer 当系统枚举通过时。我没有做任何测试,但这似乎效率低下。

    GetCustomersByUser() 方法将执行 EXISTS SQL查询的类型,同时评估安全性。这肯定会快得多,但现在我要说的是逻辑会悄悄地进入数据库,这可能会在以后产生问题。

    我确信这是人们在推出Linq时经常遇到的一个问题…对哪种方式更好有什么建议?Linq的多个查询的性能是否比数据库中的逻辑更好?

    6 回复  |  直到 8 年前
        1
  •  5
  •   Rob Levine    15 年前

    哪个更糟? 取决于你问谁。

    如果你问其他任何人,IMHO,特别是你的终端用户,务实的开发人员和那些为硬件和软件开发买单的人,他们可能会说性能的大幅下降更糟糕。

    全部的 如果你教条式地遵循它们,以牺牲真实世界的考虑(比如性能)为代价,提出一个“纯粹”的设计,你就会失败。

    远的

        2
  •  3
  •   Ryan Ternier    15 年前

    LINQ是一种抽象,它将一系列功能包装到一个漂亮的小软件包中,上面有一颗大心脏。

    对于任何抽象,你都会得到开销,主要是因为事情并不像你或我想要的那样高效。MS在使LINQ相当高效方面做了大量工作。

    1. 维护。你能很容易地得到一些工作完成后,它的发布没有拉整个事情分开。
    2. 可扩展性。
    3. 可用性。

    SQL Server是用来处理大量查询、过滤、排序和数据挖掘的。它靠这个发扬光大,所以让它去做吧。

    这不是一个逻辑蠕变,而是把功能放在它所属的地方。

        3
  •  1
  •   STO    15 年前

    如果AssignedUser已正确映射(即,Association是由Linq2SQL设计器生成的,或者您具有带有AssociationAttribute的mark属性(或其他来自 http://msdn.microsoft.com/en-us/library/system.data.linq.mapping(v=VS.90).aspx

    您也可以使用“反向”查询,如

    from c in Customer
    join u in Users on c.CustomerId equals u.AssignedToCustomerId // or other condition links user to customer
    where <you condition here>
    select c
    
        4
  •  1
  •   Amy B    15 年前

    应该不需要枚举本地客户集合。

    LinqToSql的主要目的是允许您在服务层声明逻辑,并在数据层执行该逻辑。

    int userId = CurrentUser.UserId;
    
    IEnumerable<Customer> customerQuery =
      from c in dataContext.Customers
      where c.assignedUsers.Any(au => au.UserId = userId)
      select c;
    
    List<Customer> result = customerQuery.ToList();
    
        5
  •  1
  •   code4life    15 年前

    我认为最好将您的模型描述为Customer类和User类之间的多对多关系。每个用户引用一个相关客户列表,每个客户引用一个相关用户列表。从数据库的角度来看,这是用连接表表示的(根据微软的linqtosql术语,他们称之为“连接表”)。

    多对多关系是linqtosql不支持的一个特性,如果您尝试生成DBML,您可能会注意到这一点。

    一些博客已经发布了解决方法,包括MSDN的一个(不幸的是,没有任何具体的例子)。有一个博客(分两部分)非常符合MSDN的建议:

    http://blogs.msdn.com/b/mitsu/archive/2007/06/21/how-to-implement-a-many-to-many-relationship-using-linq-to-sql.aspx

    http://blogs.msdn.com/b/mitsu/archive/2008/03/19/how-to-implement-a-many-to-many-relationship-using-linq-to-sql-part-ii-add-remove-support.aspx

        6
  •  0
  •   Mau    15 年前

    不使用它可能是一个不错的设计选择,但在我看来,设计范例是用来指导你的,而不是约束你的。