2010-11-15 55 views
1

我不確定這是否可以在LINQ中使用,但我有以下情況:如何使用LINQ從對象列表查詢到現有對象?

我使用多個查詢多次調用SharePoint列表服務。然後我填充所有查詢中的單個對象及其屬性。我正在使用LINQ來查詢返回的XElement。我知道如果調用到了這一點,只會有一個從我的LINQ查詢返回的項目。我現在必須查詢一個新的對象,然後從這個新對象(來自LINQ)爲每個Web服務調用設置我的主對象的屬性。 (以下代碼示例僅包含需要查詢和設置的'Action'項屬性的一小部分。)

是否有任何方法可將以下語句'select'放入到我現有的'action'對象中?

action = (from listItem in result.GetSPListItems() 
     select new Action 
     { 
      Title = listItem.GetSPFieldValue("Title"), 
      Description = listItem.GetSPFieldValue("Description"), 
      DeliveryOrderID = SPHelper.GetFirstLookupID(listItem 
       .GetSPFieldValue("Delivery Order")), 
      EstimatedValue = 
       ((listItem.GetSPFieldValue("Estimated Value") as double?) ?? 0), 
      AgreementTypeID = SPHelper.GetFirstLookupID(listItem 
       .GetSPFieldValue("Contract Type")), 
     }).FirstOrDefault(); 

回答

1

首先,因爲我知道我只會有一個結果,我只是願意刪除使用LINQ查詢的'選擇'部分的想法。一旦我做到了,答案就很明顯。

//just grab the first item 
var item = result.GetSPListItems().FirstOrDefault(); 

//then grab the properties into the existing ContractActionEntity        
contractAction.Title = item.GetSPFieldValue("Title"); 
contractAction.Description = item.GetSPFieldValue("Description"); 
contractAction.DeliveryOrderID = SPHelper.GetFirstLookupID(item.GetSPFieldValue("Delivery Order")); 
contractAction.EstimatedValue = item.GetSPFieldValue("Estimated Value").ToNullableDouble(); 
contractAction.AgreementTypeID = SPHelper.GetFirstLookupID(item.GetSPFieldValue("Contract Type")), 

感謝大家讓我更多地思考問題,引導我在答案的方向。

1

你能不能簡單的。因此,例如,你可以有:

var item = (from listItem in result.GetSPListItems() 
     from query2Outer in result.SecondQuery().Where(x => x.ItemEdp == it.ItemEdp).DefaultIfEmpty() // This is an outer join 
     select new Action 
     { 
      //if the one query didn't return an item then it sets the properties to the default values 
      Example = (query2Outer == null ? "Default Value" : query2Outer.Example), 
      Title = listItem.GetSPFieldValue("Title"), 
      Description = listItem.GetSPFieldValue("Description"), 
      DeliveryOrderID = SPHelper.GetFirstLookupID(listItem.GetSPFieldValue("Delivery Order")), 
      EstimatedValue = ((listItem.GetSPFieldValue("Estimated Value") as double?) ?? 0), 
      AgreementTypeID = SPHelper.GetFirstLookupID(listItem.GetSPFieldValue("Contract Type")),             
     }).FirstOrDefault(); 
+0

我不認爲這是一個好主意,如果'行動'有一些其他的屬性和操作系統想讓他們中的5個被整個實例的查詢修改。 – 2010-11-15 16:10:32

+1

@Danny - OP沒有提到是否屬於這種情況。如果是這樣,他可以在他的select語句中簡單地將現有值分配給Action的新實例。 – 2010-11-15 16:14:24

0

你可以寫在一個大的查詢您的疑問:

var item = (from listItem in result.GetSPListItems() 
      select new ContractAction 
      { 
       Title = listItem.GetSPFieldValue("Title"), 
       Description = listItem.GetSPFieldValue("Description"), 
       DeliveryOrderID = SPHelper.GetFirstLookupID(listItem.GetSPFieldValue("Delivery Order")), 
       EstimatedValue = ((listItem.GetSPFieldValue("Estimated Value") as double?) ?? 0), 
       AgreementTypeID = SPHelper.GetFirstLookupID(listItem.GetSPFieldValue("Contract Type")),             
      }).FirstOrDefault(); 

contractAction.Title = item.Title; 
contractAction.Description = item.Description; 
contractAction.DeliveryOrderID = item.DeliveryOrderID; 
contractAction.EstimatedValue = item.EstimatedValue; 
contractAction.AgreementTypeID = item.AgreementTypeID; 
1

首先,你應該命名類Action因爲Action是在內置庫定義的代表。我將在下面的代碼中使用MyAction

如果你總是需要從SPListItem得到MyAction,你最好寫一個擴展方法把邏輯放在一個乾燥的地方(不要重複自己)。

public static MyAction ToMyAction(this SPListItem item) 
{ 
    return new MyAction 
     { 
      Title = item.GetSPFieldValue("Title"), 
      Description = item.GetSPFieldValue("Description"), 
      DeliveryOrderID = SPHelper.GetFirstLookupID(item.GetSPFieldValue("Delivery Order")), 
      EstimatedValue = ((item.GetSPFieldValue("Estimated Value") as double?) ?? 0), 
      AgreementTypeID = SPHelper.GetFirstLookupID(item.GetSPFieldValue("Contract Type"))             
     }; 
} 

var action = result.GetSPListItems() 
        .Select(item => item.ToMyAction()) 
        .FirstOrDefault(); 
//var action = (from item in result.GetSPListItems() 
//    select item.ToMyAction()).FirstOrDefault(); 
0

的擴展方法的辦法另一種方法是:

public static void SelectFirstInto(this IEnumerable<ContractAction> items, ContractAction target) 
{ 
    var source = items.FirstOrDefault(); 

    if(source != null) 
    { 
     target.Title = source.Title, 
     target.Description = source.Description , 
     target.DeliveryOrderID = source.DeliveryOrderID, 
     target.EstimatedValue = source.EstimatedValue, 
     target.AgreementTypeID = source.AgreementTypeID             
    } 
} 

然後,你可以這樣做:

ContractAction targetAction = new ContractAction(); 
var item = (from listItem in result.GetSPListItems() 
      select new ContractAction 
      { 
       Title = listItem.GetSPFieldValue("Title"), 
       Description = listItem.GetSPFieldValue("Description"), 
       DeliveryOrderID = SPHelper.GetFirstLookupID(listItem.GetSPFieldValue("Delivery Order")), 
       EstimatedValue = ((listItem.GetSPFieldValue("Estimated Value") as double?) ?? 0), 
       AgreementTypeID = SPHelper.GetFirstLookupID(listItem.GetSPFieldValue("Contract Type")),             
      }).SelectFirstInto(targetAction); 

請記住,如果列表爲空,則目標對象仍未修改。這可能是你想要處理的東西。

+0

這與我正在尋找的東西非常接近,但是我想刪除抓取屬性的冗餘,然後在現有對象中再次設置它們。 – 2010-11-17 22:39:20

相關問題