Я пытаюсь создать метод расширения для IMongoCollection<TDocument>
в C#, который позволит перенести любой List<TDocument>
в коллекцию MongoDB с помощью upsert. Я нашел другие статьи, которые предлагают List<WriteModel<TDocument>>
в сочетании с BulkWriteAsyn c для выполнения этих операций в пакете.
Не в формате c, я могу добавить серию записей (в данном случае List<Line>
), используя:
public static async Task<BulkWriteResult<Line>> BulkUpsertAsyncNonGeneric(this IMongoCollection<Line> collection, List<Line> entries)
{
var bulkOps = new List<WriteModel<Line>>();
foreach (var entry in entries)
{
var filter = Builders<Line>.Filter.Eq(doc => doc.Id, entry.Id);
var upsertOne = new ReplaceOneModel<Line>(filter, entry) { IsUpsert = true };
bulkOps.Add(upsertOne);
}
return await collection.BulkWriteAsync(bulkOps);
}
Путем изменения <Line>
для <TDocument>
Я сделал это частично обобщенно c, но есть предположение, что каждый TDocument имеет поле Id
и что каждый entry in entries
также имеет поле Id
. Конечно, TDocument
не имеет участников. Я хочу сделать эти определения полей полностью обобщенными c, в идеале, используя лямбду для соответствия формату вызова Filter.Eq(doc => doc.Id, entry.Id)
. Тем не менее, я застрял. Я действительно хочу избежать простой передачи строкового литерала с именами полей, что, я считаю, будет работать нормально, но не безопасно во время компиляции.
Я пришел к следующему , что неудивительно, что не компилируется:
public static async Task<BulkWriteResult<TDocument>> BulkUpsertAsync<TDocument, TField>(this IMongoCollection<TDocument> collection, List<TDocument> entries, Expression<Func<TDocument, TField>> filterField, Expression<Func<TDocument, TField>> valueField)
{
var bulkOps = new List<WriteModel<TDocument>>();
foreach (var entry in entries)
{
var filter = Builders<TDocument>.Filter.Eq(filterField, valueField);
var upsertOne = new ReplaceOneModel<TDocument>(filter, entry) { IsUpsert = true };
bulkOps.Add(upsertOne);
}
return await collection.BulkWriteAsync(bulkOps);
}
Я подозреваю, что тип valueField неверен, но дополнительно компилятор жалуется, что
Ошибка CS1503: Аргумент 1: невозможно преобразовать из 'System.Linq.Expressions.Expression<System.Func<TDocument, TField>>'
до 'MongoDB.Driver.FieldDefinition<TDocument,
System.Linq.Expressions.Expression<System.Func<TDocument, TField>>>'
(21, 48)