c# - 如何在两个 ienumerables 之间使用 Any

标签 c# linq entity-framework asp.net-mvc-4

我的 asp.net MVC web 应用程序中有以下代码:

var currentport = tms.TMSSwitchPorts
                     .Where(a => a.SwitchID == fromID)
                     .Select(a2 => a2.PortNumber)
                     .ToList();
            if (currentport.Any(tms.TMSSwitchPorts
                                   .Where(a => a.SwitchID == toID)
                                   .Select(a => a.PortNumber)
                                   .ToList()
                               )
               )
            {
              // do something
            }

但我无法以这种方式使用 .Any(),尽管我在两个列表中都选择了 PortNumber 字段?

谁能给个建议?

最佳答案

您可以使用简单的 Join 在数据库中高效且完整地完成此操作:

var match = tms.TMSSwitchPorts.Where(a => a.SwitchID == fromID)
                              .Join(tms.TMSSwitchPorts.Where(a => a.SwitchID == toID),
                                    (a) => a.PortNumber,
                                    (b) => b.PortNumber,
                                    (a, b) => true).Any();

if (match) { ... }

生成的 SQL 应该是这样的

SELECT 
    (CASE 
        WHEN EXISTS(
            SELECT NULL AS [EMPTY]
            FROM [TMSSwitchPorts] AS [t0]
            INNER JOIN [TMSSwitchPorts] AS [t1] ON [t0].[PortNumber] = [t1].[PortNumber]
            WHERE ([t0].[SwitchID] = @p0) AND ([t1].[SwitchID] = @p1)
            ) THEN 1
        ELSE 0
     END) AS [value]

所以你没有任何数据期望单个 10通过网络移动,您不必弄乱您的应用程序内存。


代码

if (currentport.Any(tms.TMSSwitchPorts
                               .Where(a => a.SwitchID == toID)
                               .Select(a => a.PortNumber)
                               .ToList()
                           )

不会工作因为Any需要一个 Func<T, bool> 形式的谓词, 但你传递给它一个 List<Int> (假设 PortNumber 是一个 int )。

关于c# - 如何在两个 ienumerables 之间使用 Any,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23806210/

相关文章:

c# - 在 Linux 中使用带有 DbContext 的 Entity Framework 有问题

c# - Convert.ToInt32 和 Int32.Parse 之间有什么区别?

c# - 将触发器添加到过渡

c# - 根据父节点的属性获取子节点

c# - 忽略所有属性,但 Entity Framework 6 中的一些属性

c# - Entity Framework 4 和 SYSUTCDATETIME()

c# - Visual Studio 2008用红色强调非错误代码

c# - 模拟 IEnumerable<T> 类型的 GetEnumerator() 方法

c# - LINQ 将列表项列表加入一个列表

c# - 当表为 varchar() 时,如何验证数据以防止注入(inject)攻击