C# C LINQ:如何正确地堆栈LINQ查询
我有一个表单,允许用户执行无数次搜索。需要联接的表因输入的搜索条件而异。我下面的示例非常简单,因为两个表都使用相同的子表进行连接,但实际问题并没有那么简单 我一直在使用一种称为LINQ堆叠的技术,如下所示:C# C LINQ:如何正确地堆栈LINQ查询,c#,sql-server,linq-to-sql,C#,Sql Server,Linq To Sql,我有一个表单,允许用户执行无数次搜索。需要联接的表因输入的搜索条件而异。我下面的示例非常简单,因为两个表都使用相同的子表进行连接,但实际问题并没有那么简单 我一直在使用一种称为LINQ堆叠的技术,如下所示: IQueryable<LogENT> results = Context.AssignedLogsENT.Where(l => l.AgencyId); if(txtFirstName.Text != null) results = from r in resul
IQueryable<LogENT> results = Context.AssignedLogsENT.Where(l => l.AgencyId);
if(txtFirstName.Text != null)
results = from r in results
join a in Context.LogAssignmentsENT on r.DisplayLogId equals a.LogId
join p in Context.PersonsENT on a.ObjectId equals p.DisplayPersonId
&& !a.Deleted &&
p.FirstName.StartsWith(Object.FirstName)
select r;
if(txtLastName.Text != null)
results = from r in results
join a in Context.LogAssignmentsENT on r.DisplayLogId equals a.LogId
join p in Context.PersonsENT on a.ObjectId equals p.DisplayPersonId
&& !a.Deleted &&
p.LastName.StartsWith(Object.LastName)
select r;
results = from r in results
join a in Context.LogAssignmentsENT on r.DisplayLogId equals a.LogId
join p in Context.PersonsENT on a.ObjectId equals p.DisplayPersonId
&& !a.Deleted &&
(txtFirstName.Text != null || p.FirstName.StartsWith(Object.FirstName)) &&
(txtLastName.Text != null || p.LastName.StartsWith(Object.LastName))
select r;
因此,如果设置了某个文本字段,我会根据需要添加到查询中。这实际上工作得很好,只是当我使用SQL Profiler查看生成的查询时,每次添加新条件时,它都是在内部连接表
i、 e.日志分配表包括3、4、5次。有没有办法防止它多次加入同一个表
或者,有没有更好的办法?我已经看过谓词生成器,但是它似乎不允许连接表,这在我的例子中是一个要求
谢谢 您可以构建基本结果,然后动态添加where子句。如果只使用一个查询,您可以对其进行如下修改:
IQueryable<LogENT> results = Context.AssignedLogsENT.Where(l => l.AgencyId);
if(txtFirstName.Text != null)
results = from r in results
join a in Context.LogAssignmentsENT on r.DisplayLogId equals a.LogId
join p in Context.PersonsENT on a.ObjectId equals p.DisplayPersonId
&& !a.Deleted &&
p.FirstName.StartsWith(Object.FirstName)
select r;
if(txtLastName.Text != null)
results = from r in results
join a in Context.LogAssignmentsENT on r.DisplayLogId equals a.LogId
join p in Context.PersonsENT on a.ObjectId equals p.DisplayPersonId
&& !a.Deleted &&
p.LastName.StartsWith(Object.LastName)
select r;
results = from r in results
join a in Context.LogAssignmentsENT on r.DisplayLogId equals a.LogId
join p in Context.PersonsENT on a.ObjectId equals p.DisplayPersonId
&& !a.Deleted &&
(txtFirstName.Text != null || p.FirstName.StartsWith(Object.FirstName)) &&
(txtLastName.Text != null || p.LastName.StartsWith(Object.LastName))
select r;
这种方法不起作用,因为在任何后续的查询中都没有定义p。但问题是Where依赖于联接表,因此我无法在动态添加的Where中引用联接表…@user482286:您是否检查了结果查询以查看是否确实存在联接?