将此结构化为一个陈述?

时间:2013-03-19 14:18:09

标签: c# entity-framework

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

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,但这两种方法对我来说都显得有些笨拙。

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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)
          };