gpt4 book ai didi

c# - LINQ 连接列和可为 null 的变量

转载 作者:行者123 更新时间:2023-11-30 12:30:56 24 4
gpt4 key购买 nike

我正在尝试通过匹配列来使用 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 是一个可为 null 的 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)

有什么办法可以加快速度吗?

最佳答案

LINQ 中的

join 假定内部联接(无空值)。尝试将空内容拉出到单独的 where 子句中。我认为这些方面的内容应该适用于您所描述的内容。

from lt in cxt.CmsPageRow
join page in cxt.CmsPage on lt.CmsPageID == page.CmsPageID
where cmsSiteID == null ||
(cmsSiteID != null && (page.CmsSiteID == null || page.CmsSiteId == cmsSiteID.Value))
select ...

更新

我没有意识到性能对您来说是个问题。在这种情况下,我建议根据运行时已知的值创建不同的查询结构,而不依赖于单独的行:

var rows = 
from lt in cxt.CmsPageRow
join page in cxt.CmsPage on lt.CmsPageID == page.CmsPageID
select new {lt, page};
if (cmsSiteID != null)
{
rows = rows.Where(r => r.page.CmsSiteID == null ||
r.page.CmsSiteId == cmsSiteID.Value));
}
var data = rows.Select(...);

此外,如果您的数据上下文设置正确,您应该能够使用导航属性来稍微简化您的代码。

var rows = ctx.CmsPageRow;
if (cmsSiteID != null)
{
rows = rows.Where(r => r.CmsPage.Any(p => p.CmsSiteID == null ||
p.CmsSiteId == cmsSiteID.Value));
}
var data = rows.Select(...);

关于c# - LINQ 连接列和可为 null 的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15014521/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com