如何将这个foreach循环转换为Linq代码?

Gal*_*kin 3 c# linq

我是Linq的新手,我想修改旧的c#代码以使用Linq.这段代码的想法是选择所有未设置的表和引用的字段PrimaryTable等于"myTable"


foreach (Table table in dbServer.Tables)
            {
                if (!table.IsSet)
                {
                    foreach (Reference refer in table.References)
                    {
                        if (refer.PrimaryTable == "myTable")
                        {
                            tables.Add(table);
                        }
                    }
                }
            }

在互联网上挖掘后我得到了这段代码


var q = from table in dbServer.Tables
                    let refers = from refer in table.References
                                 where refer.PrimaryTable == "myTable"
                                 select refer.ForeignTable
                    where refers.Contains(table.Name)
                    select table;

但它根本不起作用,我需要你的帮助才能使它有效.

提前致谢.

Lee*_*Lee 18

var tables = dbServer.Tables
    .Where(t => !t.IsSet)
    .SelectMany(t => t.References)
    .Where(r => r.PrimaryTable == "myTable")
    .ToList();
Run Code Online (Sandbox Code Playgroud)

假设表是一个 List<T>

编辑:正如评论所指出的,这与原作不同 - 看起来你真正想要的是这个:

var tables = dbServer.Tables
    .Where(t => !t.IsSet && t.References.Any(r => r.PrimaryTable == "myTable"))
    .ToList();
Run Code Online (Sandbox Code Playgroud)

这将为您提供所有具有PrimaryTable为'myTable'的引用的表,该引用假定只有一个匹配的引用表.否则,您可以多次添加相同的表.


Dan*_*haw 5

只需要使用两个来自

        var q = from table in dbServer.Tables
                where !table.IsSet
                from refer in table.References
                where refer.PrimaryTable == "myTable"
                select table;
Run Code Online (Sandbox Code Playgroud)