Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C LINQ:如何正确地堆栈LINQ查询_C#_Sql Server_Linq To Sql - Fatal编程技术网

C# C 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

我有一个表单,允许用户执行无数次搜索。需要联接的表因输入的搜索条件而异。我下面的示例非常简单,因为两个表都使用相同的子表进行连接,但实际问题并没有那么简单

我一直在使用一种称为LINQ堆叠的技术,如下所示:

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:您是否检查了结果查询以查看是否确实存在联接?