var result = from R in db.Clients.Where(clientWhere)
join RA in db.ClientAgencies on R.SysID equals RA.SysID
join A in db.Agencies.Where(agencyWhere) on RA.AgencyID equals A.AgencyID
join AC in db.AdCommittees on A.AgencyID equals AC.AgencyID into temp
from x in temp.DefaultIfEmpty().Distinct()
select new {R,RA,x};
如果用户输入了委员会ID,这就是我所做的,但我觉得必须有更好的方法。
var query = (from R in result
where R.x.CommitteeID == params.CommitteeID
select R.R).Distinct();
return query;
有更好的方法吗?
答案 0 :(得分:0)
您是如何使用这些数据的?连接可能会伤害到你,这取决于你想要实现的目标(如果没有数据结构的上下文,我们很难查看)。
除了说您似乎有一个您可能需要或可能不需要的数据记录之外,我不能对linq提出错误。
我遇到的另一个问题是,当您调用DefaultIfEmpty()时,您将执行查询。这意味着要进行过滤,您可能会再次点击数据库来计算结果。
您是否可以提供有关数据库架构的一些信息以及您尝试从查询中获得的信息?
答案 1 :(得分:0)
如果您没有将中间查询用于其他任何内容,我会翻转它(首先按committeeID
过滤):
Client GetCommitteeClient(int committeeID)
{
return (
from AC in db.AdCommittees
where AC.CommitteeID == committeeID
join A in db.Agencies.Where(agencyWhere) on AC.AgencyID equals A.AgencyID
join RA in db.ClientAgencies on A.AgencyID equals RA.AgencyID
join R in db.Clients.Where(clientWhere) on RA.SysID equals R.SysID
select R
).SingleOrDefault();
}