【问题标题】:Left Outer Join and Exists in Linq To SQL C# .NET 3.5左外连接并存在于 Linq To SQL C# .NET 3.5
【发布时间】:2010-10-10 20:14:06
【问题描述】:

我一直在翻译返回唯一父行的 LINQToSQL 的左外连接。

我有 2 个表(Project、Project_Notes,它是由 Project_ID 链接的一对多关系)。我正在对 2 表的多个列进行关键字搜索,如果 Project_Notes 中的列包含关键字,我只想返回唯一的项目。我有这个 linqtoSQl 序列,但它似乎返回多个项目行。也许在LINQ中以某种方式执行Exist?或者可能是某种 groupby?

这是 LINQToSQL:

 query = from p in query
 join n in notes on p.PROJECT_ID equals n.PROJECT_ID into projectnotes
 from n in notes.DefaultIfEmpty()
 where n.NOTES.Contains(cwForm.search1Form)
 select p;

这是它从分析器生成的 SQL

exec sp_executesql N'SELECT [t2].[Title], [t2].[State], [t2].[PROJECT_ID], [t2].[PROVIDER_ID], [t2].[CATEGORY_ID], [t2].[City], [t2].[UploadedDate], [t2].[SubmittedDate], [t2].[Project_Type]FROM (SELECT ROW_NUMBER() OVER (ORDER BY [t0].[UploadedDate]) AS [ROW_NUMBER], [t0].[Title], [t0].[State], [t0].[PROJECT_ID], [t0].[PROVIDER_ID], [t0].[CATEGORY_ID], [t0].[City], [t0].[UploadedDate], [t0].[SubmittedDate], [t0].[Project_Type] FROM [dbo].[PROJECTS] AS [t0] LEFT OUTER JOIN [dbo].[PROJECT_NOTES] AS [t1] ON 1=1 WHERE ([t1].[NOTES] LIKE @p0) AND ([t0].SubmittedDate] >= @p1) AND ([t0].[SubmittedDate]

此查询在结果中返回 1 对多关系的所有复数。我从这里找到了如何在 LINQ 中执行 Existshttp://www.linq-to-sql.com/linq-to-sql/t-sql-to-linq-upgrade/linq-exists/

这是使用 Exists 的 LINQToSQL:

query = from p in query
where (from n in notes
where n.NOTES.Contains(cwForm.search1Form)
select n.PROJECT_ID).Contains(p.PROJECT_ID)
select p;

生成的SQL语句:

exec sp_executesql N'SELECT COUNT(*) AS [value] FROM [dbo].[PROJECTS] AS [t0] WHERE (EXISTS(SELECT NULL AS [EMPTY] FROM [dbo].[PROJECT_NOTES] AS [t1] WHERE ([t1].PROJECT_ID] = ([t0].[PROJECT_ID])) AND ([t1].[NOTES] LIKE @p0))) AND ([t0].[SubmittedDate] >= @p1) AND ([t0].[SubmittedDate]

我通过使用Existsdatabind() 得到一个SQL 超时。

【问题讨论】:

  • 显示明显来自 Skip、Take 和 Count 的生成 SQL 并且不向我们显示 Skip、Take 和 Count 有点糟糕。
  • 都是由Gridview控件生成的。因为我将数据绑定到它上面,所以我不必进行自定义分页。

标签: c# asp.net sql linq-to-sql left-join


【解决方案1】:

它似乎返回了多个项目行

是的,这就是 join 的工作方式。如果一个项目有 5 个匹配的注释,它会显示 5 次。


如果问题是 - “加入”是错误的习语!

您想将项目过滤到那些注释包含特定文本的项目:

var query = db.Project
  .Where(p => p.Notes.Any(n => n.NoteField.Contains(searchString)));

【讨论】:

    【解决方案2】:

    您将不得不使用 DefaultIfEmpty 扩展方法。已经有一些关于 SO 的问题显示了如何做到这一点。这是一个很好的例子:

    How can I perform a nested Join, Add, and Group in LINQ?

    【讨论】:

      猜你喜欢
      • 2015-06-20
      • 1970-01-01
      • 2011-10-14
      • 1970-01-01
      • 2013-09-09
      • 2010-09-21
      • 2013-06-13
      • 1970-01-01
      相关资源
      最近更新 更多