В своем ответе вы говорите, что «в 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);
});
.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
Вышеупомянутые ситуации работают, когда эти 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();
Выполнение эквивалента 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;
db.SomeTable.Where(x => new[] {2,3,4,5}.Contains(x));
или
from x in db.SomeTable
where new[] {2,3,4,5}.Contains(x)
. Содержит
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)
должен выполнять то, что требуется.
Очень простой пример использования .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);
Вы можете написать справочный метод:
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;