我正在为显示的网格编写过滤器,因此显示的唯一项目是与登录用户具有相同位置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'不存在,如果尝试包含而不是等于它会抱怨无效的参数。
答案 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;
}