我有以下方法根据参数中指定的条件过滤商店:
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();
}
事情是:OrderCreaatorIds
,OrderItemCategoryIds
可以是 null
和 StatusId
可以是 0
。在那种情况下,我不想有那些 where 子句,例如如果 OrderCreaatorIds
为 null
,则查询应按如下方式工作:
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/