如何使用LINQ to Objects通过更改参数值来对同一集合进行即席查询

问题描述 投票:0回答:1

我需要根据以下业务需求获取数据。我们针对销售的商品启动活动,这会给客户一些折扣等。我们出售不同品牌的商品,每个品牌有多种产品,每种产品都有多种型号。

在市场活动表中,如果市场活动在项目中的某个特定模型上,那么将插入一条记录,其中包含该模型的正确品牌标识,该模型的产品标识以及模型标识。如果广告系列针对某个产品的所有型号,则插入一条记录,记录中正确的brandid ad productid和modelid为0(这意味着适用于该产品的所有型号)。如果广告系列涉及某个品牌的所有型号和产品,那么将插入一条记录,其中带有正确的brandid,其productid和modelid为0(这意味着该品牌的所有产品和型号均适用)。

[以前,我们在存储过程中具有逻辑,我们将检查modelid上的计数,如果count是0,然后检查modelid为0的产品id,然后在productid,modelid为0的品牌级别。 > 0,我们将获取相应的数据。

现在,我们已使用linq查询将此逻辑移至业务层。我已将每个Brandid的广告系列数据放入缓存中。因此,cahce将是cache_brandid。我会从缓存中获取品牌特定的数据,然后检查modelid,如果没有找到数据,然后将产品id与modelid设置为0,再一次,如果没有找到数据,然后在brand id处将productid,modelid设置为0。但是,我正在寻找与以前使用SP从数据库中获取数据相比,与以前从DB中获取数据相比,我缓存并从缓存中应用此数据中的逻辑的数据更加干净。对于每个这样的数据获取,我现在从缓存中获取许多记录并遍历它们直到获得数据,但是SP只会检查计数,这比获取数据要快,并且在发现计数为1时仅会提取1条记录。 > 0

我当前的代码如下:

cacheList.FirstOrDefault(x=>x.brandid = b && x.productid == p && x.modelid == m && x.modelyear == myr)
??
cacheList.FirstOrDefault(x=>x.brandid == b && x.productid == p && x.modelid == m && x.modelyear == 0)
??
cacheList.FirstOrDefault(x=>x.brandid == b && x.productid == p && x.modelid == 0 && x.modelyear == myr)
??
cacheList.FirstOrDefault(x=>x.brandid == b && x.productid == p && x.modelid == 0 && x.modelyear == 0)
??
cacheList.FirstOrDefault(x=>x.brandid == b && x.productid == 0 && x.modelid == 0 && x.modelyear = 0);

任何使我的方法更清洁,更快的帮助都会对我有很大帮助。

谢谢

c# algorithm performance linq-to-objects
1个回答
0
投票

您可以尝试一次迭代:让我们为每个项目分配Sime类型的score,然后获得具有最佳score的项目:

   var data = cacheList
     .Where(x => x.brandid == b &&
                (x.productid ==   p || x.productid == 0) &&
                (x.modelid   ==   m || x.modelid   == 0) && 
                (x.modelyear == myr || x.modelyear == 0))
     .Select(x => new {
        item  =  x,
        score = (x.productid ==   p ? 1 : 0) * 100 + 
                (x.modelid   ==   m ? 1 : 0) * 10 + 
                (x.modelyear == myr ? 1 : 0)
      });

   // TODO: put the right type here (instead of MyObject)
   MyObject bestItem = null;
   int bestScore     =   -1;

   foreach (var item in data) {
     if (item.score > bestScore) {
       bestScore = item.score;
       bestItem  = myItem;

       // Maximum possible score 
       if (bestScore >= 111)
         break;
     } 
   }  
© www.soinside.com 2019 - 2024. All rights reserved.