2013-03-02 33 views
1

我試圖弄清楚如何將多個值放入WHERE子句中;這是你在SQL中使用IN子句的那種。將多個值放入Azure移動服務的WHERE子句中

我當前的代碼:

if (Log.Count() == 1) 
{ 
    items = itemTable 
     .Where(Item => Item.id == Log[0].i_id) 
     .ToCollectionView(); 
} 
else if (Log.Count() == 2) 
{ 
    items = itemTable 
     .Where(Item => Item.id == Log[0].i_id || Item.id == Log[1].i_id) 
     .ToCollectionView(); 
} 
else if (Log.Count() == 3) 
{ 
    items = itemTable 
     .Where(Item => Item.id == Log[0].i_id || Item.id == Log[1].i_id || Item.id == Log[2].i_id) 
     .ToCollectionView(); 
} 

這是很討厭的。我無法找到一種方法來將多個值放入WHERE子句中,但沒有大的if語句。有任何想法嗎?

回答

1

我面臨同樣的問題。使用任何或包含像其他人所建議給我一個不支持的例外。我發佈在Azure移動服務論壇上,並被告知IN尚未受支持。他們建議我使用完全適合我的擴展方法。以下是我使用的代碼。

public static class Extensions 
{ 
    public async static Task<List<T>> In<T>(this IMobileServiceTable<T> table, List<int> ids) 
    { 
     var query = new StringBuilder("$filter=("); 
     for (int i = 0; i < ids.Count; i++) 
     { 
      query.AppendFormat("id eq {0}", ids[i]); //don't forget to url escape and 'quote' strings 
      if (i < ids.Count - 1) 
      { 
       query.Append(" or "); 
      } 
     } 
     query.Append(")"); 
     var list = await table.ReadAsync(query.ToString()); 
     var items = list.Select(i => MobileServiceTableSerializer.Deserialize<T>(i)).ToList(); 
     return items; 
    } 
} 

你的列表可以通過調用擴展方法是這樣來填充:

FavoriteJokesList = await jokeItemTable.In(favoriteJokeIds); 

來源:http://social.msdn.microsoft.com/Forums/en-US/azuremobile/thread/b573ff6c-1f6b-4846-b44d-4678e3d26f66

+0

非常感謝!看起來應該可以正常工作。 – SlashThingy 2013-03-17 09:25:18

2
items = itemTable.Where(Item => Log.Any(i => i.i_id == Item.id)).ToCollectionView(); 
+0

+1爲第一:) – 2013-03-02 09:45:56

+0

順便說一下,它的肩膀d是'i => i.i_d == ...' – 2013-03-02 09:47:03

+0

@Oscar Mederos,哎呀,是的,謝謝。 – aush 2013-03-02 09:47:55

3

試試這個:

items = itemTable 
    .Where(Item => Log.Any(logItem => logItem.i_id == Item.id)) 
    .ToCollectionView(); 

編輯:(響應 「不支持異常」)

你可以試試這個替代方案,看看後臺支持它:

var ids = Log.Select(logItem => logItem.i_id).ToList(); 
var items = itemTable 
    .Where(Item => ids.Contains(Item.id)) 
    .ToCollectionView(); 
+0

完成此操作後,我得到一個System.NotSupportedException。 – SlashThingy 2013-03-02 13:37:01

+0

經過一番調查後,它似乎是任何觸發它的方法中的參數。使用'items = itemTable 。Where(Item => Log.Any)) .ToCollectionView();'不提供任何錯誤。 – SlashThingy 2013-03-02 14:26:44

+0

@ user2070752對於'IQueryable',答案取決於查詢處理器支持的內容。沒有錯誤的查詢是否返回您期望的結果? – dasblinkenlight 2013-03-02 15:13:34

0

只是爲了記錄在案,在最新的在Azure移動服務SDK版本( 1.0),這個工程:

var ids = Log.Select(logItem => logItem.i_id).ToList(); 
var items = await itemTable 
.Where(Item => ids.Contains(Item.id)) 
.ToCollectionAsync();