c# - Linq - 条件包含()

标签 c# sql .net linq contains

我有以下方法根据参数中指定的条件过滤商店:

public int[] GetShopIds(IEnumerable<Guid> OrderCreaatorIds, IEnumerable<Guid> OrderItemCategoryIds, int StatusId)
    {
        var query = from s in _db.Shops
                    join o in _db.Orders on s.Id equals o.ShopId
                    join oi in _db.OrderItems on o.Id equals oi.OrderId
                    where
                    OrderCreaatorIds.Contains(o.CreatorId)
                    && OrderItemCategoryIds.Contains(oi.CategoryId)
                    && (int)o.StatusId == StatusId
                    select s.Id;

        return query.ToArray();
    }

事情是:OrderCreaatorIdsOrderItemCategoryIds 可以是 nullStatusId 可以是 0。在那种情况下,我不想有那些 where 子句,例如如果 OrderCreaatorIdsnull,则查询应按如下方式工作:

public int[] GetShopIds(IEnumerable<Guid> OrderCreaatorIds, IEnumerable<Guid> OrderItemCategoryIds, int StatusId)
    {
        var query = from s in _db.Shops
                    join o in _db.Orders on s.Id equals o.ShopId
                    join oi in _db.OrderItems on o.Id equals oi.OrderId
                    where
                    OrderItemCategoryIds.Contains(oi.CategoryId)
                    && (int)o.StatusId == StatusId
                    select s.Id;

        return query.ToArray();
    }

等等

不幸的是 OrderCreaatorIds != null && OrderCreaatorIds.Contains(o.CreatorId) 不工作。

最佳答案

public int[] GetShopIds(IEnumerable<Guid> OrderCreaatorIds, IEnumerable<Guid> OrderItemCategoryIds, int StatusId)
{
    var query = from s in _db.Shops
        join o in _db.Orders on s.Id equals o.ShopId
        join oi in _db.OrderItems on o.Id equals oi.OrderId
        select new { s = s, o = o, oi = oi };

    if (null != OrderCreaatorIds)
        query = query.Where(x_ => OrderCreaatorIds.Contains(x_.o.CreatorId));

    if (null != OrderItemCategoryIds)
        query = query.Where(x_ => OrderItemCategoryIds.Contains(x_.oi.CategoryId));

    if (0 < StatusId)
        query = query.Where(x_ => (int)x_.o.StatusId == StatusId);

    return query.select(x_ => x_.s.Id).ToArray();
}

也许您必须向 IQueryable<> 添加一些转换以使其可编译。我没有在编译器中检查它。

关于c# - Linq - 条件包含(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38120087/

相关文章:

c# - 计算系数以获得正常速度的动画

mysql - 选择列作为行并对结果进行分组

c# - 通过Docker在IIS上部署经典ASP应用程序

c# - 使用 SmtpClient (C#) 发送大量邮件需要很长时间

c# - 在不使用子文档中的鉴别器的情况下将 C# 类序列化到 MongoDB

c# - System.StackOverflowException 未处理

c# - LINQ 列中的方法调用

mysql - 导出 localhost Sql 并将其导入服务器上给我 errno 150

SQL完全清空数据库

c# - 我可以在单个泛型类型上指定多个约束吗?