Linq - 如何在Where子句</entity>中使用List <entity>类型的变量

时间:2013-06-05 16:47:10

标签: linq entity-framework tsql

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

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

      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子句中出现“cant convert string to bool”错误。我尝试使用'=='而不是'equals',同样的错误。

最后我尝试'包含'就像这样:

where t.SiteCode.Contains(UserLoc)

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

====编辑====

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

    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'不存在,如果尝试包含而不是等于它会抱怨无效的参数。

1 个答案:

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