2016-03-10 25 views
0

我目前有一個異步查詢如下,這是很好,並允許我使用FirstOrDefaultAsync/ToListAsync方法。LINQ選擇新的異步/等待

public async Task<X> FindXAsync(int x) 
{ 
     var q = from c in context.X 
       where c.Id == x 
       select c; 

     return await q.FirstOrDefaultAsync(); 
} 

但是我試圖來擴展查詢,選擇到一個新的類

public async Task<XClass> FindXAsync(int x) 
{ 
    var q = from c in context.X 
      where c.Id == x 
      select new XClass (
      c.Id,c.Header ......... 
      ); 

    return await q.FirstOrDefaultAsync(); 
} 

對於上面可以不再使用FirstOrDefaultAsync()只FirstOrDefault(),我不知道會是什麼是將此功能引入異步方法的最有效方法。 謝謝, 克里斯

+0

爲什麼你不能? – tede24

+1

爲什麼不使用'context.X.FirstOrDefaultAsync(y => y.Id == x);'? –

+0

@MihailStancescu因爲他想投影結果與選擇 – tede24

回答

2

在這種情況下,最簡單的答案是可能只是做(異步)第一選擇和然後創建類型你需要:

public async Task<XClass> FindXAsync(int x) 
{ 
    var q = from c in context.X 
      where c.Id == x 
      select c; 
    var c = await q.FirstOrDefaultAsync(); 
    return new XClass (
      c.Id,c.Header ......... 
); 
} 
+0

謝謝Stephen,在閱讀完評論後意識到了這個問題,但是謝謝你的回答。附: C#Cookbook中的併發性是開始使用異步編程工作的極好參考書。 – Chris

+0

在旁邊注意這將如何與存儲過程的結果一起工作,結果是一個IEnumerable? – Chris

+0

@Chris:我對sprocs沒有太多經驗,但我相信它應該可以正常工作;它將作爲IQueryable通過網絡公開,我期望EF的'FirstOrDefaultAsync'工作。 –

1

與通用類型化參數的嘗試:

return await q.FirstOrDefaultAsync<XClass>(); 
+0

q不包含FirstOrDefaultAsync的定義 – Chris

+0

從EntittyFramework添加對「System.Data.Entity」的引用。 –

+0

此外,您需要使用'XClass'的無參數構造函數。即'新的XClass {Id = c.Id,...}'而不是'新的XClass(c.Id,...)' –