2013-03-02 52 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();