【发布时间】:2013-02-21 23:59:04
【问题描述】:
我正在尝试使用 LINQ 通过匹配列来连接表,其中连接表中的列等于变量或变量为空(此时连接仍然需要在该字段上进行)。
我的 LINQ 类似于:
var data = (
from lt in cxt.CmsPageRow
join page in cxt.CmsPage on new { lt.CmsPageID, cmsSiteID.Value } equals new { page.CmsPageID, page.CmsSiteID }
...
cmsSiteID 是一个可为空的 INT。
我无法编译我的代码,因为它抱怨“在调用 'Join' 时类型推断失败。”
除此之外,我只需要在 cmsSiteID 不为空时加入 page.CmsSiteID。如果 cmsSiteID 为 null,则 lt.CmsPageID 上的连接仍然需要发生。
* 编辑 *
这个问题现在有点改变了。我可以通过在我的 LINQ 中的连接上使用 WHERE 子句来让它做我想做的事情。
join page in cxt.CmsPage.Where(p=>(cmsSiteID==0||p.CmsSiteID==cmsSiteID)) on lt.CmsPageID equals page.CmsPageID
但是,这仍然运行缓慢。如果我将传递的参数更改为文字,它会立即执行。
慢跑者
(@p__linq__1 = 0 OR [Extent2].[CmsSiteID] = @p__linq__1)
跑得快
(267 = 0 OR [Extent2].[CmsSiteID] = 267)
有没有办法加快速度?
【问题讨论】:
-
cmsSiteID来自哪里?那是在别处声明的变量吗? -
您实际上是从
page中选择一些东西,还是纯粹为了知道从中提取多少项目而使用它?如果您从中选择一些东西,如果cmsSiteID为空,您是否希望这些值为空? -
cmsSiteID 是正在调用的执行 LINQ 的函数中的可为空参数。 cmsSiteID 不可能永远为空,除非我正在编辑现有代码,这些代码可能在其他地方具有不包含新添加的 cmsSiteID 参数的方法。
-
那么如果有人提供了 CmsSiteId,它是否应该包含 CmsSiteId 为空的项目?