我得到一个等于49000左右的业务实体(表数据)集合。我正在尝试使用Add方法将此集合中的某些值复制到anothr集合,并手动将值添加到其属性
例如 //返回arounf 49000 VendorProduct集合这是指VendorProduct表中的数据
List<VendorProduct> productList = GetMultiple(req);
foreach (VendorProduct item in productList)
{
VendorSearchProductWrapper wrapperItem = new VendorSearchProductWrapper();
IEnumerable<ClientProductPreference> prodPrefClient = item.ClientProductPreferences.Where(e => (e.VendorProductId.Equals(item.Id)
&& (e.AccountId.Equals(SuiteUser.Current.AccountId))));
if (prodPrefClient.Count() == 1)
{
foreach (ClientProductPreference it in prodPrefClient)
{
wrapperItem.ClientProdID = it.Id;
wrapperItem.ClientProductDescription = it.Description;
wrapperItem.MarkupPct = it.MarkUpPct;
wrapperItem.SalesPrice = it.SalesPrice;
}
}
wrapperItem.Code = item.Code;
wrapperItem.ListPrice = item.ListPrice;
wrapperItem.Id = item.Id;
wrapperItem.DiscountPct = ValueParser.SafeDecimal(item.Discount, null);
wrapperItem.Discountgroup = item.DiscountGroup.DiscountGroup;
wrapperItem.Description = item.Description;
wrapperItem.Unit = item.Unit;
wrapperItem.ClientName = item.Account.ClientName;
products.Add(wrapperItem);
}
要复制所有49000条记录,需要花费大量时间。实际上,5分钟内只有100-200条记录被添加到列表中。
我需要在约1分钟内更快地复制这些值。
提前致谢
Francis P。
答案 0 :(得分:1)
IEnumerable<ClientProductPreference> prodPrefClient = item.ClientProductPreferences.Where(e => (e.VendorProductId.Equals(item.Id)
&& (e.AccountId.Equals(SuiteUser.Current.AccountId))));
if (prodPrefClient.Count() == 1)
{
foreach (ClientProductPreference it in prodPrefClient)
{
这段代码有很多错误。
尝试将此值检索为SingleOrDefault,然后检查NULL。你这样做的方式是在相同的数据上迭代TWICE。首先得到计数,第二次在foreach中迭代(这也是无用的,因为你知道集合只有一个项目并且为一个项目创建整个一个迭代器是疯狂的)
是否可以使用某种词典?
检查延迟加载。当你知道你需要数据时(我可以看到你需要它们),你应该急于加载它们以减少大量的数据库调用。
执行此操作的最佳方法是创建专用SQL(或LINQ,因为它非常简单)查询,它将在DB上执行完全执行。这将是最快的解决方案。
答案 1 :(得分:0)
即使您拥有代码,这也应该更快地发生。你确定那里没有任何冗长的操作吗?例如。延迟加载,其他数据调用,......
即使很小的也会对49000次迭代产生重大影响
答案 2 :(得分:0)
我同意@Bertvan。迭代不应该花费那么多时间(即使记录是49K)。
我建议考虑以下几行(可能会产生问题):
if (prodPrefClient.Count() == 1)
不确定你想在这里做什么,但是这个调用正在迭代一个懒惰的集合。请考虑是否需要此检查。
wrapperItem.DiscountPct = ValueParser.SafeDecimal(item.Discount, null);
Int / double比较器确实需要一些处理时间。您还应该通过删除此行代码来检查操作所花费的总时间。
希望这会有所帮助。