1

我试图弄清楚如何将多个值放入一个WHERE子句中;IN这是您在 SQL 中使用子句的那种事情。

我当前的代码:

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 语句,我找不到将多个值放入该子句的方法。有任何想法吗?

4

4 回答 4

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();
于 2013-03-02T09:44:10.593 回答
2
items = itemTable.Where(Item => Log.Any(i => i.i_id == Item.id)).ToCollectionView();
于 2013-03-02T09:43:55.500 回答
1

我遇到了同样的问题。像其他人建议的那样使用 Any 或 Contains 给了我一个不支持的异常。我在 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

于 2013-03-06T04:36:43.600 回答
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();
于 2013-06-21T16:22:04.020 回答