我需要获取基于以下业务需求的数据。我们在我们销售的项目上推出活动,这给客户一些折扣等。我们销售不同品牌的项目,每个品牌有多个产品,每个产品有多个型号。
在campaign表中,如果活动在项目中的一个特定型号上,则插入一条记录,其中包含该型号的正确品牌、该型号的productid和型号id。如果活动在产品的所有型号上,则插入一条记录,并将适当的品牌广告产品If和模型If设置为0(这意味着适用于该产品的所有型号)。如果活动针对的是某个品牌的所有型号和产品,则会使用适当的品牌标识插入一条记录,并将productid、modelid设为0(这意味着适用于该品牌的所有产品和型号)。
以前我们在存储过程中有这样的逻辑,我们将检查modelid的计数,如果count为0,则检查modelid为0的产品id,然后在品牌级别检查productid为0,modelid为0的产品。只要计数大于0,我们就会获取相应的数据。
现在,我们已经使用linq查询将此逻辑转移到了业务层。我已经将每个品牌的活动数据放在缓存中。所以cahce应该是cache_brandid。我会从缓存中获取特定于品牌的数据,然后检查modelid,如果没有找到数据,则使用modelid为0的product id,如果没有找到数据,则使用productid为0的品牌id,modelid为0。然而,我正在寻找更干净的方式来做这件事,因为我缓存的数据和应用来自缓存的数据的逻辑比我以前使用SP从数据库获取的数据更多。对于每次这样的数据获取,我现在从缓存中获取许多记录,并迭代它们,直到我获得数据,但是SP将只检查计数,这比获取数据更快,并且当它发现计数>0时,将仅获取1条记录
我当前的代码如下所示:
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);
让我的方法更干净更快的任何帮助都会对我有很大的帮助。
谢谢
发布于 2020-01-15 15:24:40
您可以尝试只迭代一次:让我们为每个项目分配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 {
value = 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 = item.value;
// Maximum possible score
if (bestScore >= 111)
break;
}
}
https://stackoverflow.com/questions/59746330
复制相似问题