我需要根据以下业务需求获取数据。我们针对销售的商品启动活动,这会给客户一些折扣等。我们出售不同品牌的商品,每个品牌有多种产品,每种产品都有多种型号。
在市场活动表中,如果市场活动在项目中的某个特定模型上,那么将插入一条记录,其中包含该模型的正确品牌标识,该模型的产品标识以及模型标识。如果广告系列针对某个产品的所有型号,则插入一条记录,记录中正确的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);
任何使我的方法更清洁,更快的帮助都会对我有很大帮助。
谢谢
您可以尝试一次迭代:让我们为每个项目分配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;
}
}