2012-06-05 129 views
0

我附加了一個簡單的LINQ查詢。 我想知道是否有更好和有效的方法來拉動這三個字段(Field1,Field2,Field3),如下面的LINQ查詢中所述。優化Linq查詢

from currentCons in ActiveConnections 
join accounts in Accounts on currentCons.New_AccountId equals accounts.AccountId          
let Field1 =(from holder in MapHolders 
     join entity in Entities on stringmap.ObjectTypeCode equals entity.ObjectTypeCode 
     where entity.Name == "New_Connection" 
     where holder.AttributeName == "New_Data" 
     where holder.AttributeValue == currentCons.New_DATA_Val 
     select holder.Value) 
let Field2=(from holder in MapHolders 
     join entity in Entities on stringmap.ObjectTypeCode equals entity.ObjectTypeCode 
     where entity.Name == "New_Connection" 
     where holder.AttributeName == "New_Type" 
     where holder.AttributeValue == currentCons.New_Type 
     select holder.Value) 
let Field3=(from holder in MapHolders 
     join entity in Entities on stringmap.ObjectTypeCode equals entity.ObjectTypeCode 
     where entity.Name == "New_Connection" 
     where holder.AttributeName == "New_EntryPoint" 
     where holder.AttributeValue == currentCons.New_EntryPoint 
     select holder.Value) 
    where currentCons.ModifiedOn >= Convert.ToDateTime("1/1/2011") 
    where currentCons.ModifiedOn <= Convert.ToDateTime("5/5/2012") 
    select new 
    { 
     conId = currentCons.ConnectionId, 
     ConName = currentCons.name, 
     TypeId = currentCons.Type, 
     AccountId = currentCons.AccountId, 
     OId = currentCons.OwnerId, 
     BandwidthId = currentCons.Bandwidth, 
     EntryPointId = currentCons.EntryPoint, 
     Cap = Field1 , 
     Dir=Field2, 
     EP=Field3, 
     ModifiedOn = currentCons.ModifiedOn 
    } 

我知道另一種方式是直接放入選擇塊。什麼是有效的方法來做到這一點?

任何指針表示讚賞。

謝謝。

+0

什麼LINQ提供您正在使用可空用下面的? LINQ to SQL? LINQ to Entities?還有別的嗎? – svick

+0

我在這裏使用LINQ To SQL。 – Tabish

回答

1
var fromDate = new DateTime(2011,1,1); 
var toDatePlusOneDay = new DateTime(2012,5,5).AddDays(1); // add one day to ensure 

var result = from currentCons in ActiveConnections 
      join accounts in Accounts on currentCons.New_AccountId equals accounts.AccountId          
      where currentCons.ModifiedOn >= fromDate 
      where currentCons.ModifiedOn < toDatePlusOneDay 
      from holder in MapHolders 
      where (holder.AttributeName == "New_Data" && holder.AttributeValue == currentCons.New_DATA_Val) || (holder.AttributeName == "New_Type" && holder.AttributeValue == currentCons.New_Type) || (holder.AttributeName == "New_EntryPoint" && holder.AttributeValue == currentCons.New_EntryPoint) 
      select new 
      { 
       conId = currentCons.ConnectionId, 
       ConName = currentCons.name, 
       TypeId = currentCons.Type, 
       AccountId = currentCons.AccountId, 
       OId = currentCons.OwnerId, 
       BandwidthId = currentCons.Bandwidth, 
       EntryPointId = currentCons.EntryPoint, 
       ModifiedOn = currentCons.ModifiedOn, 
       Cap = (holder.AttributeValue == currentCons.New_DATA_Val) ? holder.Value : null, 
       Dir = (holder.AttributeValue == currentCons.New_Type) ? holder.Value : null, 
       EP = (holder.AttributeValue == currentCons.New_EntryPoint) ? holder.Value : null    
      } 

我刪除,因爲它沒有任何結果

join entity in Entities on stringmap.ObjectTypeCode equals entity.ObjectTypeCode 
     where entity.Name == "New_Connection" 

也請檢查帽子/ DIR/EP是