C# 如何在mongo中使用带有空字段的表达式

C# 如何在mongo中使用带有空字段的表达式,c#,mongodb,linq,.net-core,C#,Mongodb,Linq,.net Core,你好 我对mongo db和linq有意见。 例如:我有订单类: class Order { public virtual int Id { get; set; } public virtual int FactoryId { get; set; } } 每个订单属于一个工厂(通过FactoryId字段) 现在我有了当前用户: class User { public virtual int Id { get; set; } public virtual Fact

你好 我对mongo db和linq有意见。 例如:我有订单类:

class Order
{
    public virtual int Id { get; set; }
    public virtual int FactoryId { get; set; }
}
每个订单属于一个工厂(通过FactoryId字段)

现在我有了当前用户:

class User
{
    public virtual int Id { get; set; }
    public virtual Factory Factory { get; set; }
}
用户可以链接到工厂,也可以是系统范围的(访问所有工厂,因此工厂为空)

现在,我想获取当前用户可以访问的所有订单:

var orders = db
    .GetCollection<Order>("order").AsQueryable()
    .Where(x => currentUser.Factory == null || x.FactoryId == currentUser.Factory.Id)
    .ToArray();
我创建了复制此行为的示例:

如果我将用户更改为绑定到工厂的用户-所有工作正常

所以我不明白我错过了什么


我在mongodb.driver 2.10.4中使用了.net core 3.1,这是因为您试图访问空对象的属性:

x.FactoryId == currentUser.Factory.Id
因此,为了解决这个问题,我们可以检查属性工厂是否为null,如果它设置了其他一些在数据库中找不到的值,如-1,如果它不是null,那么我们可以分配它的Id。示例如下:

        var currentUser = new User();
        var factoryId = currentUser.Factory == null ? -1 : currentUser.Factory.Id;
        //Now exception should not be thrown
        var orders = db
            .GetCollection<Order>("orders").AsQueryable()
            .Where(x => currentUser.Factory == null || 
                   x.FactoryId == factoryId)
            .ToArray();
var currentUser=new User();
var factoryId=currentUser.Factory==null-1:currentUser.Factory.Id;
//现在不应该抛出异常
var订单=db
.GetCollection(“订单”).AsQueryable()
.Where(x=>currentUser.Factory==null | |
x、 FactoryId==FactoryId)
.ToArray();

发生这种情况是因为您试图访问空对象的属性:

x.FactoryId == currentUser.Factory.Id
因此,为了解决这个问题,我们可以检查属性工厂是否为null,如果它设置了其他一些在数据库中找不到的值,如-1,如果它不是null,那么我们可以分配它的Id。示例如下:

        var currentUser = new User();
        var factoryId = currentUser.Factory == null ? -1 : currentUser.Factory.Id;
        //Now exception should not be thrown
        var orders = db
            .GetCollection<Order>("orders").AsQueryable()
            .Where(x => currentUser.Factory == null || 
                   x.FactoryId == factoryId)
            .ToArray();
var currentUser=new User();
var factoryId=currentUser.Factory==null-1:currentUser.Factory.Id;
//现在不应该抛出异常
var订单=db
.GetCollection(“订单”).AsQueryable()
.Where(x=>currentUser.Factory==null | |
x、 FactoryId==FactoryId)
.ToArray();

是的,我理解为什么我得到空引用,但这个表达式是访问权系统的一部分,我不能添加这样的代码。我只有一个地方可以添加检查-表达式。我希望where is priority规则应该是-如果表达式的第一部分为true,那么我们不需要计算OR condition的第二部分是,我理解为什么我得到空引用,但是这个表达式是访问权系统的一部分,我不能添加这样的代码。我只有一个地方可以添加检查-表达式。我希望优先级规则应该在哪里——若表达式的第一部分为真,那个么我们就不需要计算或条件的第二部分