2015-11-10 50 views
0

我使用WCF數據服務來使用分頁來獲取數據。Foreach更新LINQ結果中的每條記錄

我必須爲客戶提供一個特定的對象(ExtraData),但是在數據庫中不存在這樣的數據。它是幾個表的組合數據,它有1行使它可交叉連接。

由於WCF數據服務不允許動態創建對象,返回的數據必須位於查詢中。

該服務以客戶要求的形式返回更新的數據。

我有以下方法:

[WebGet] 
public IQueryable<ExtraData> GetExtraData(string groupID) 
{ 
var query= (from data in context.Data       
      join information in context.Information on information.ID equals data.InformationID into tempInformation 
      from information in tempInformation.DefaultIfEmpty() 
      from extraData in context.ExtraData // cross-joining the dummy 
      where data.GroupID == groupID 
      select new 
      { 
      ExtraData = extraData, 
      Data = data, 
      InformationText = information.Text 
      }).ToList(); 

//After the execution, I intend to modify the result (as it is a dummy record yet): 

query.ForEach(
     item => 
     {  
      item.ExtraData.DataID = item.Data.ID; 
      item.ExtraData.Name = item.Data.NameAux; 
      item.ExtraData.Group = elem.Data.ExtraGroup;  
     } 
    ); 

    return (from item in query 
       select item.ExtraData).AsQueryable(); 
} 

不幸的是,它會修改每次每個記錄,所以我最終具有相同的記錄多次。

我應該修改哪些內容以使ExtraData記錄具有唯一性?

UPDATE:

在foreach裏面,我得到這樣的數據:

3ca65876-c88f-4849-bef5-170e62f084ec Name16 
b705ebc3-8245-4c16-8045-a79ef15192d2 Name16 
b8bb423c-02ff-4e9a-b941-a20a9c69dd12 Name Second 16 
4e3d3496-4b36-4dab-b471-a43ffb075345 Other16 
f93a2358-818e-4929-a51a-46a7b7080bd4 Test16 
a4bca994-73d2-4d0e-a18a-2539067a7498 Test Second 16 
c7474a92-430a-46ad-bc3d-7e526dfb2647 New Test 16 
6117f1b6-3f6b-4fae-b448-2778d68d0877 New Test Mod 16 
8e831455-4305-4ee3-b56d-3b0e23131df8 Test Mod 16 

在結果集,我得到這個:

<entry><id>http://localhost/MyService/Service.svc/ExtraData(guid'8e831455-4305-4ee3-b56d-3b0e23131df8')</id><category term="ExtraData" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" /><link rel="edit" title="ExtraData" href="ExtraData(guid'8e831455-4305-4ee3-b56d-3b0e23131df8')" /><title /><updated>2015-11-10T10:07:36Z</updated><author><name /></author><content type="application/xml"><m:properties><d:ID m:type="Edm.Guid">8e831455-4305-4ee3-b56d-3b0e23131df8</d:ID><d:Name>Test Mod 16</d:Name><d:Group m:type="Edm.Int32">1</d:Group></m:properties></content></entry> 
<entry><id>http://localhost/MyService/Service.svc/ExtraData(guid'8e831455-4305-4ee3-b56d-3b0e23131df8')</id><category term="ExtraData" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" /><link rel="edit" title="DSPaciens" href="ExtraData(guid'8e831455-4305-4ee3-b56d-3b0e23131df8')" /><title /><updated>2015-11-10T10:07:36Z</updated><author><name /></author><content type="application/xml"><m:properties><d:ID m:type="Edm.Guid">8e831455-4305-4ee3-b56d-3b0e23131df8</d:ID><d:Name>Test Mod 16</d:Name><d:Group m:type="Edm.Int32">1</d:Group></m:properties></content></entry> 
+0

你真的需要交叉連接ExtraData嗎?這*會導致很多記錄。 ExtraData = new ExtraData()'已經足夠了嗎? –

+0

我無法使用任何實例,因爲Data Services在創建新實體時失敗。它必須位於查詢中。它包含一行,所以交叉連接應該不會產生額外的記錄,只會產生額外的列。 – Nestor

+2

那麼,你正在創建一個交叉連接(故意)。你爲什麼不把它刪除?另請注意,這些並不都是獨特的ExtraData對象。數據庫中每行只有一個這樣的對象。你多次寫同一個對象。 – usr

回答

0

好了,我們都非常接近解決方案:)

關鍵因素是@usr寫道:

數據庫中每行只有一個這樣的對象。你多次寫 相同的對象。

不幸的是,所選擇的匿名對象是只讀的,所以我必須創建一個包裝類保存必要的數據:

public class CombinedData 
{ 
    public ExtraData ExtraData { get; set; } 
    public Data Data { get; set; } 
    public string InformationText {get; set; } 
} 

然後使用它的查詢中:

var query= (from data in context.Data       
      join information in context.Information on information.ID equals data.InformationID into tempInformation 
      from information in tempInformation.DefaultIfEmpty() 
      from extraData in context.ExtraData // cross-joining the dummy 
      where data.GroupID == groupID 
      select new CombinedData 
      { 
      ExtraData = extraData, 
      Data = data, 
      InformationText = information.Text 
      }).ToList(); 

然後創建ForEach循環中一個新的對象而額外:

query.ForEach(
     item => 
     { 
      item.ExtraData=new ExtraData();  
      item.ExtraData.DataID = item.Data.ID; 
      item.ExtraData.Name = item.Data.NameAux; 
      item.ExtraData.Group = elem.Data.ExtraGroup;  
     } 
    ); 

現在,它的工作。感謝您指點我正確的方向:)

+0

是的,這也適用。但我建議使用不同的模式:'return query.AsEnumerable()。Select(x => new {...})。AsQueryable();'。並適當填寫'...'。這導致更好的代碼。減少副作用和突變,不會將實體類錯誤地用作DTO。 – usr

+0

同意,你的方法更好。但是,在給定的情況下,我的實體類充當DTO(按用途,它不創建或更新現有的數據庫記錄),所以我使用上面的代碼。感謝您的幫助。 – Nestor