代码之家  ›  专栏  ›  技术社区  ›  mare

具有Linq到实体性能的实体框架

  •  0
  • mare  · 技术社区  · 15 年前

        private static bool TicArticleExists(string supplierIdent)
        {
            using (TicDatabaseEntities db = new TicDatabaseEntities())
            {
                if((from a in db.Articles where a.SupplierArticleID.Equals(supplierIdent) select a).Count() > 0)
                    return true;                
            }
            return false;
        }
    

    在foreach循环的不同地方使用这个方法,或者只是简单地多次调用它,它是否每次都创建并打开新的连接?

    1. 如果我的类只包含静态方法,它应该是静态的吗?因为现在不是。。

    谢谢你的澄清。

    4 回复  |  直到 15 年前
        1
  •  1
  •   Brian Webster Jason    12 年前
    • 由于使用了连接缓存,新连接的成本不高。基本上,它获取一个已经打开的连接(我认为它们会保持打开2分钟以便重用)。

    • 不过,缓存可能更好。我真的不喜欢“第一个默认值”。想一想你是否能在一个语句中准确地引入更多的内容,然后从中着手。

    剩下的,我什么也说不出来——太多取决于你在那里实际做了什么。什么是数据库实体?可以缓存吗?要多久?和(3)一样-我们不知道,因为我们不知道里面还有什么。

    如果这像是得到一些查找字符串供以后使用,我会说。。。。

    • 用classI,class II,class III打造一把钥匙
    • 将它们放入静态/缓存字典中,假设它们通常不会更改(我想我在这里有这个想法-这是一个金融流数据库吗?)

    4:是的,这是有记载的。First给出First或异常,FirstOrDefault默认为default(初始化为0的空结构,类为null)。

        2
  •  0
  •   mare    15 年前

    谢谢丹和汤姆,我想到了这个。如果你看到有什么东西或订单,请你评论一下好吗?

        public static IEnumerable<Article> TicArticles
        {
            get
            {
                ObjectCache cache = MemoryCache.Default;
                if (cache["TicArticles"] == null)
                {
                    CacheItemPolicy policy = new CacheItemPolicy();
                    using(TicDatabaseEntities db = new TicDatabaseEntities())
                    {
                        IEnumerable<Article> articles = (from a in db.Articles select a).ToList();
                        cache.Set("TicArticles", articles, policy);
                    }
                }
    
                return (IEnumerable<Article>)MemoryCache.Default["TicArticles"];
            }
        }
    
    
        private static bool TicArticleExists(string supplierIdent)
        {
            if (TicArticles.Count(p => p.SupplierArticleID.Equals(supplierIdent)) > 0)
                return true;
            return false;
        }
    

    如果这是好的,我会让我所有的方法都遵循这个模式。

        3
  •  0
  •   Amy B    15 年前

    它是否每次都创建并打开新连接?

    否。连接已缓存。

    不。不要缓存整个表。

    我应该使ticdatabaseentitis变量为静态的并在类级别初始化它吗?

    如果我的类只包含静态方法,它应该是静态的吗?

    当然。。。这样做可以防止任何人创建类的无用实例。

    我还注意到,如果我返回result.First()而不是FirstOrDefault(),并且查询没有找到匹配项,它将发出异常


    我将您现有的方法重写为:

    using (TicDatabaseEntities db = new TicDatabaseEntities()) 
    {
      bool result = db.Articles
        .Any(a => a.supplierArticleID.Equals(supplierIdent));
    
      return result;
    }
    

    如果在循环中调用该方法,我将重写为:

    private static Dictionary<string, bool> TicArticleExists
      (List<string> supplierIdents)   
    {
      using (TicDatabaseEntities db = new TicDatabaseEntities())   
      {   
        HashSet<string> queryResult = new HashSet(db.Articles
          .Where(a => supplierIdents.Contains(a.supplierArticleID))
          .Select(a => a.supplierArticleID));
    
        Dictionary<string, bool> result = supplierIdents
          .ToDictionary(s => s, s => queryResult.Contains(s));
    
        return result;
      }
    }
    
        4
  •  0
  •   Tim Ridgely    15 年前

    from a in db.Articles where a.SupplierArticleID.Equals(supplierIdent) select 1
    

    另外,请使用Any而不是Count>0