Что linq эквивалентен оператору SQL IN

В своем ответе вы говорите, что «в Firebase Firestore тип массива не допускает список объектов».

Это не правильно: вы можете хранить объекты в массиве. В консоли Firebase сначала нужно выбрать тип данных массива, а затем для каждого элемента массива выбрать тип карты. С помощью JavaScript SDK вы можете сохранить документ, содержащий массив объектов.


Исходя из вышеизложенного, вы можете использовать следующий подход при использовании Firestore:

  • иметь коллекцию guide документов
  • для каждого guide документа в этой коллекции:
    • используйте значение id в качестве идентификатора документа;
    • имеет поле sources массива типов, в котором вы храните объекты, подобные тому, который показан в вашем вопросе.

Таким образом, вы можете запросить свой guides по документу id и получить массив следующим образом:

var docRef = db.collection("guides").doc(guideId);

docRef.get().then(doc => {
    if (doc.exists) {
        const sourcesArray = doc.data().sources;
        sourcesArray.forEach((element) => {
            console.log(element.type); 
            console.log(element.url); 
        });
    } else {
        // doc.data() will be undefined in this case
        console.log("No such document!");
    }
}).catch(function(error) {
    console.log("Error getting document:", error);
});
53
задан Backwards_Dave 5 December 2018 в 18:33
поделиться

7 ответов

.Contains

var resultset = from x in collection where new[] {2,3,4,5}.Contains(x) select x

Конечно, с вашей простой проблемой, вы могли бы иметь что-то вроде:

var resultset = from x in collection where x >= 2 && x <= 5 select x
49
ответ дан 7 November 2019 в 08:40
поделиться

Вышеупомянутые ситуации работают, когда эти Contains функция используется против примитивов, но что, если Вы имеете дело с объектами (например, myListOrArrayOfObjs.Contains(efObj))?

я нашел решение! Преобразуйте Ваш efObj в string, это разделяется _ для каждого поля (можно почти думать о нем как о представлении CSV obj)

, пример такого может быть похожим на это:

     var reqAssetsDataStringRep = new List<string>();

        foreach (var ra in onDemandQueueJobRequest.RequestedAssets)
        {
            reqAssetsDataStringRep.Add(ra.RequestedAssetId + "_" + ra.ImageId);
        }

        var requestedAssets = await (from reqAsset in DbContext.RequestedAssets
                                     join image in DbContext.Images on reqAsset.ImageId equals image.Id
                                     where reqAssetsDataStringRep.Contains(reqAsset.Id + "_" + image.Id)
                                     select reqAsset
                                           ).ToListAsync();
0
ответ дан 7 November 2019 в 08:40
поделиться

Выполнение эквивалента SQL IN с IEnumerable.Contains () .

var idlist = new int[] { 2, 3, 4, 5 };

var result = from x in source
          where idlist.Contains(x.Id)
          select x;
25
ответ дан 7 November 2019 в 08:40
поделиться
db.SomeTable.Where(x => new[] {2,3,4,5}.Contains(x));

или

from x in db.SomeTable
where new[] {2,3,4,5}.Contains(x)
10
ответ дан 7 November 2019 в 08:40
поделиться

. Содержит

var resultset = from x in collection where new[] {2,3,4,5}.Contains(x) select x

Конечно, с вашей простой проблемой, вы можете иметь что-то вроде:

var resultset = from x in collection where x >= 2 && x <= 5 select x
-121--1040661-

Это должно быть что-то подобное. Исходный запрос был не совсем понятен, адаптируйте его к вашим потребностям.

@products = Product.find(:all,
  :limit => 5,
  :conditions => ["locale = ? AND id <> ? AND tags.name IN (?)", "en", 1, ['a','b'],
  :joins => "tags"
)
-121--3214511-

Оператор IEnumerable < T > .Contains (T) должен выполнять то, что требуется.

3
ответ дан 7 November 2019 в 08:40
поделиться

Очень простой пример использования .Contains ()

List<int> list = new List<int>();
for (int k = 1; k < 10; k++)
{
    list.Add(k);
}

int[] conditionList = new int[]{2,3,4};

var a = (from test in list
         where conditionList.Contains(test)
         select test);
2
ответ дан 7 November 2019 в 08:40
поделиться

Вы можете написать справочный метод:

    public bool Contains(int x, params int[] set) {
        return set.Contains(x);
    }

и использовать сокращенный код:

    var resultset = from x in collection
                    where Contains(x, 2, 3, 4, 5)
                    select x;
1
ответ дан 7 November 2019 в 08:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: