我正在将一些存储过程转换为vb.net linq(SQL to linq ....手动),因为存储过程很慢。linq是否阻塞线程?
我在并发线程中使用linq查询。
运行性能分析后,我发现linq在查询时似乎锁定源集合(如下面代码段中的cache.IPMS_TBL_EL_PRICE_COMPONENT)。
这是真的吗? linq有没有(not_lock/lock)选项? 我真的不希望集合被锁定。它会减慢多线程查询。
非常感谢。
代码段:
看到http://imgur.com/Z9vsR或见下文
insert0 = (From PPC In cache.IPMS_TBL_EL_PRODUCT_PRICE_COMPONENT_MAPPING
From PC In cache.IPMS_TBL_EL_PRICE_COMPONENT
Join LK In cache.IPMS_TBL_LOOKUP
On PC.Component_Type_Id Equals LK.Lookup_Id
Where (PC.Component_Id = PPC.Component_Id OrElse PC.Component_Type_Id = CC3_ID) _
AndAlso LK.Commodity_Id = ELE_COMMODITY_ID _
AndAlso LK.Lookup_Type.ToLower = PRICE_COMPONENT_TYPE.ToLower _
AndAlso PPC.Product_Id = IN_PRODUCT_ID _
AndAlso PPC.Price_Type_Id = IN_PRICE_TYPE_ID _
AndAlso PC.Is_Deleted = 0 _
AndAlso LK.Lookup_Id > MINUS_HUNDRED _
AndAlso PC.Component_Id > MINUS_HUNDRED _
AndAlso lookupValues.Contains(LK.Lookup_Value.ToLower) _
AndAlso (Not PC.ISO_Id.HasValue OrElse Not deletedISO.Contains(PC.ISO_Id.Value))
Select New PriceComponents() With {.ComponentID = PC.Component_Id,
.ComponentName = PC.Component_Name,
.ComponentTypeID = PC.Component_Type_Id,
.ComponentTypeName = LK.Lookup_Value,
.Sequence = PC.Sequence,
.OrderSequence = orderSequeceDict(LK.Lookup_Value.ToLower),
.IsMTM = PC.Is_MTM,
.UcapUsageFactorUnitPrice = PC.UCAP_Usage_Factor_UnitPrice,
.Percentage = PERCENTAGE}
).OrderBy(Function(e As PriceComponents) e.OrderSequence).ThenBy(Function(e As PriceComponents) e.Sequence) _
.Distinct(New PriceComponentsComparer_PK_9_Fields).ToList
如果'cache'是一个LINQ to SQL数据上下文,那么它不应该跨线程共享。 –
让我们在这里备份一下......你知道为什么存储过程很慢吗?这是转换为L2S的一个不寻常的原因。 LINQ查询是否执行您的存储过程? –
在查询过程中,有关阻塞(非延迟,同步执行)或什么被锁定(阻止多线程使用)的问题?这些是非常不同的事情。 – 2011-10-20 19:26:42