0

我正在为显示的网格编写过滤器,因此显示的唯一项目是那些与登录的人具有相同位置 ID 的项目。我有 linq 查询来获取登录用户的位置(是的,用户可以有多个位置),现在我正在尝试写什么

我有一个变量,有时是一个列表,有时是一个值,但从不为空(它是一个位置代码列表)。我尝试了几种不同的方法,但都抛出错误。

      public List<Person> GetPeople()
    {
        var UserLoc = repo.GetUserLocations();

        foreach (var item in UserLoc)
        {
            var query = (from p in db.Person
                              join t in db.TrespassedLocation on p.PersonId equals t.PersonId 
                              where t.SiteCode == item.LocationCode
                              select p).ToList();
            return query;
        }
        // Don't know what to return here?
    }

如果我能弄清楚在 foreach 之外要返回什么,上面看起来会起作用。

我也试过:

    public List<Person> GetPeople()
    {
        var UserLoc = repo.GetUserLocations();

        var query = (from p in db.Person
                           join t in db.TrespassedLocation on p.PersonId equals t.PersonId 
                           where t.SiteCode equals UserLoc
                           select p).ToList();
        return query;
    }

但这会在 where 子句中出现“无法将字符串转换为布尔值”错误。我尝试使用'=='而不是'equals',同样的错误。

最后我尝试了这样的“包含”:

where t.SiteCode.Contains(UserLoc)

但这会给出错误“最佳匹配重载具有无效参数”,可能是因为它需要一个字符串,而不是一个列表。

==== 编辑 ====

根据提供的链接,我想出了这个:

    public List<Person> GetPeople()
    {
        var UserLoc = GetUserLocations();

        var query = db.Person
                                .Join(db.TrespassedLocation,
                                            p => p.PersonId,
                                            t => t.PersonId,
                                            (p, t) => new { p, t })
                                .Where(t.SiteCode.equals(UserLoc));
    }

但我仍然在 where 子句中遇到错误('t' 不存在,如果尝试包含而不是等于它抱怨无效参数。

4

1 回答 1

3

如果您有一个对象列表并且您想查看某个特定对象是否在该列表中,那么您可以:

myList.Contains(myObject);

您正在查看您的列表是否包含您的对象。你上面的所有样本似乎都有这个倒退。

回到你的原始样本,试试这个:

public List<Person> GetPeople()
{
  // Get the list of codes that the user belongs to
  var userLocationCodes = repo.GetUserLocations().Select(i => i.LocationCode);

  // Do one query to see if the location is in your list of location codes
  var query = (from p in db.Person
    join t in db.TrespassedLocation on p.PersonId equals t.PersonId
    where userLocationCodes.Contains(t.SiteCode)
    select p);
  return query.ToList();
}

但是,一些实体框架提供者不喜欢.Contains本地列表。

如果是这种情况,请像最初那样遍历本地列表,并将每次迭代查询的结果添加到主结果集中。

public List<Person> GetPeople()
{
  var UserLoc = repo.GetUserLocations();

  // This is what you return
  var results = new List<Person>(); 

  foreach (var item in UserLoc)
  {
    var query = (from p in db.Person
      join t in db.TrespassedLocation on p.PersonId equals t.PersonId
      where t.SiteCode == item.LocationCode
      select p).ToList();

    // Add this query to your master results
    results.AddRange(query);
  }
  return results;
}
于 2013-06-05T17:57:40.253 回答