Присоединение к коллекции и списку создает исключение NotSupportedException в C # Mongodb со строго типизированным драйвером - PullRequest
2 голосов
/ 11 мая 2019

Я использую официальный строго типизированный драйвер C # MongoDb версии 2.8.0 для взаимодействия с MongoDB.

Когда я пытаюсь присоединиться к коллекции mongodb типа Meals со списком типа MealsRequest, я получаю следующее исключение: -

System.NotSupportedException: The joined collection cannot have any qualifiers."

Вот мой код: -

public class Meal
{
    [BsonId]
    [BsonRepresentation(representation: BsonType.ObjectId)]
    public string Id { get; set; }

    public string RestaurantId { get; set; }

    public string Category { get; set; }

    public string Name { get; set; }

    public decimal Price { get; set; }

    public int Calories { get; set; }

    public string Photo { get; set; }
}

public class MealRequest
{
    [BsonId]
    [BsonRepresentation(representation: BsonType.ObjectId)]
    public string Id { get; set; }

    [Required(ErrorMessage = "This field is required")]
    public string MealId { get; set; }

    [Required(ErrorMessage = "This field is required")]
    public int Count { get; set; }

    public decimal Price { get; set; }

    public decimal MealTotal { get; set; }

    public string Name { get; set; }
}

И это код, который выдает исключение: -

var mealsRequests = await repository.Meals.AsQueryable()
    .Join(inner: mealsRequests, outerKeySelector: m => m.Id, innerKeySelector: mr => mr.MealId,
    resultSelector: (m, mr) => new MealRequest()
    {
        Id = mr.Id,
        MealId = m.Id,
        Count = mr.Count,
        Price = m.Price,
        Name = m.Name,
    }).ToListAsync();//Exception happens at this line 

return mealsRequests;

А это трассировка стека: -

System.NotSupportedException: The joined collection cannot have any qualifiers.
at MongoDB.Driver.Linq.Processors.Pipeline.MethodCallBinders.JoinBinder.Bind(PipelineExpression pipeline, PipelineBindingContext bindingContext, MethodCallExpression node, IEnumerable`1 arguments)
at MongoDB.Driver.Linq.Processors.MethodInfoMethodCallBinder`1.Bind(PipelineExpression pipeline, TBindingContext bindingContext, MethodCallExpression node, IEnumerable`1 arguments)
at MongoDB.Driver.Linq.Processors.PipelineBinderBase`1.BindMethodCall(MethodCallExpression node)
at MongoDB.Driver.Linq.Processors.Pipeline.PipelineBinder.Bind(Expression node, IBsonSerializerRegistry serializerRegistry)
at MongoDB.Driver.Linq.MongoQueryProviderImpl`1.Prepare(Expression expression)
at MongoDB.Driver.Linq.MongoQueryProviderImpl`1.Translate(Expression expression)
at MongoDB.Driver.Linq.MongoQueryProviderImpl`1.ExecuteAsync[TResult](Expression expression, CancellationToken cancellationToken)
at MongoDB.Driver.Linq.MongoQueryableImpl`2.ToCursorAsync(CancellationToken cancellationToken)
at MongoDB.Driver.IAsyncCursorSourceExtensions.ToListAsync[TDocument](IAsyncCursorSource`1 source, CancellationToken cancellationToken)

В чем причина этого исключения? И как это решить?

1 Ответ

0 голосов
/ 11 мая 2019

взаимосвязи и навигация чрезвычайно просты с MongoDB.Entities , который представляет собой облегченную оболочку для официального драйвера.он также поддерживает асинхронную синхронизацию, хотя следующий пример является кодом синхронизации.

using System.Linq;
using MongoDB.Entities;

namespace StackOverflow
{
    public class Meal : Entity
    {
        public string Name { get; set; }
        public Many<MealRequest> Requests { get; set; }

        public Meal() => this.InitOneToMany(() => Requests);
    }

    public class MealRequest : Entity
    {
        public One<Meal> Meal { get; set; }
        public string Name { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            new DB("retaurant-test");

            var meal = new Meal { Name = "pollo e funghi pasta" };
            meal.Save();

            var mealRequest = new MealRequest
            {
                Name = "pasta meal",
                Meal = meal.ToReference()
            };
            mealRequest.Save();

            meal.Requests.Add(mealRequest);

            var chickenMushroomPastaMealRequests = DB.Collection<MealRequest>()
                                                     .Where(mr => mr.Meal.ID == meal.ID)
                                                     .ToList();

            var resMealRequests = meal.Requests.Collection().ToList();

            var resMeal = resMealRequests.First().Meal.ToEntity();
        }
    }
}

Если это необходимо сделать с помощью официального драйвера, я бы сделал это с помощью linq следующим образом:

var mealrequests = (from m in repo.Meals.AsQueryable()
                    join mr in repo.MealRequests.AsQueryable() on m.ID equals mr.MealID into requests
                    from r in requests
                    select r).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...