2

我有一个数据库,其中包括一对多外键,例如

Table {shop
[Id]
...}

Table {user
[Id]
[Shop_id]
[Archived]
}

我也有如下方法

public IEnumerable<shop> GetShopDetails(int shopId)
{
    var foo = (from s in context.Shops
    where s.Id = shopId
    select s).ToList();

    return foo;
}

因此,它将返回该商店的所有用户。大多数时候,我只真正想要未存档的用户。

有没有办法将它写入一个语句,所以我可以传入,比如 includeArchived 的第二个参数,并使用它来确定我是返回所有用户,还是只返回那些活跃的用户。

目前,我可以通过向我的商店对象添加一个返回用户子集的方法来使其工作,或者我可以加载商店,获取其 id,然后创建包含适当 fk 的单独用户集合,但是这两种方法对我来说都显得有些笨拙。

4

2 回答 2

2

只需有条件地添加另一个Where条件:

public IQueryable<user> GetShopUsers(int shopId, bool includeArchived = false)
{
    var foo = from u in context.Users
              where u.Shop_id = shopId
              select u;

    if(!includeArchived)
        foo = foo.Where(u => !u.Archived);  

    return foo;
}
于 2013-03-19T14:22:46.593 回答
0

我想这就是你想要的?您可以将另一个布尔参数集成到您的查询中,就像您已经对shopId.

public IQueryable<user> GetUsers(int shopId, bool includeArchived)
{
    return from user in context.Users
           where user.Shop_id = shopId
           where includeArchived || !user.Archived
           select user;
}

更新:不确定您是否可以过滤商店实体自己的用户集合。您可以尝试构造匿名对象的查询:

var foo = from s in context.Shops
          where s.Id = shopId
          select new {
              Shop = s,
              Users = s.Users.Where(u => includeArchived || !u.Archived)
          };
于 2013-03-19T14:22:51.973 回答