c# - C# 中的 LINQ 查询?

标签 c# linq

我是 C# 和 Linq 编程世界的新手。 我想做类似的事情,但是 SubType 是表类型的 FK,我不能做我在这个例子中所做的事情:

public static List<DropdownModel> GetSubTypes(List<string> ListTypes)
    {
        List<DropdownModel> SubTypes = new List<DropdownModel>();
        using (DocumentXtractorEntities DataBase = new DocumentXtractorEntities())
        {
            foreach (string TypeID in ListTypes)
            {
                int TypeIDINT = Int32.Parse(TypeID);
                SubTypes.AddRange((from C in DataBase.SubType.Where(s => s.Active && s.TypeID == TypeIDINT)
                            select new DropdownModel()
                            {
                                ID = C.SubTypeID,
                                Description = C.Name,
                                Selected = false
                            }).ToList());
            }
        }
        return SubTypes;
    }

因此,当我选择一种或多种类型时,上面的代码有点过滤子类型文本框。 现在,我需要做相反的事情,在选择子类型时填充类型列表。

我已经尝试过一些东西,但我知道我这样做是不可能的。 我现在的代码是这样的:

    public static List<DropdownModel> GetTypesBySubTypes(List<string> ListSubTypes)
    {
        List<DropdownModel> Types = new List<DropdownModel>();
        using (DocumentXtractorEntities DataBase = new DocumentXtractorEntities())
        {
            foreach (string SubTypeID in ListSubTypes)
            {
                int SubTypeIDINT = Int32.Parse(SubTypeID);
                Types.AddRange((from C in DataBase.Type.Where(s => s.Active && s.SubType.Contains(SubTypeIDINT))
                                select new DropdownModel()
                                {
                                    ID = C.TypeID,
                                    Description = C.Name,
                                }).ToList());
            }
        }
        return Types;
    }

[编辑]

我已经设法做一个 sql 查询来完成这项工作:

select T.TypeID from Type T join SubType ST on St.TypeID=T.TypeID
where ST.SubTypeID=3

但我不知道如何将其转换为 linq 查询并执行 Type.AddRange()。

有人可以帮我吗?

最佳答案

您可以使用 Intersect 方法从提供的子类型列表中查找包含任何子类型的类型。这也消除了使用 foreach 进行迭代并将其留给 Linq 处理的需要。

List<int> subTypes = ListSubTypes.Select(s => int.Parse(s)).ToList();
DataBase.Type.Where(s => s.SubType.Select(st => st.SubTypesID).Intersect(subTypes).Any())

这是一个基于您的代码的示例。

public static List<DropdownModel> GetTypesBySubTypes(List<string> ListSubTypes)
    {
        List<DropdownModel> Types = new List<DropdownModel>();
        List<int> subTypes = ListSubTypes.Select(s => int.Parse(s)).ToList();

        using (DocumentXtractorEntities DataBase = new DocumentXtractorEntities())
        {
                Types.AddRange((from C in DataBase.Type
                               .Where(s => s.Active 
                                       && subTypes.Intersect(s.SubType.Select(st => st.SubTypesID)).Any())
                                select new DropdownModel()
                                {
                                    ID = C.TypeID,
                                    Description = C.Name,
                                }).ToList());

        }
        return Types;
    }

HTH

关于c# - C# 中的 LINQ 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57677154/

相关文章:

c# - "checked = false"的复选框(事件)方法

c# - DateTime类常见错误再次显示

c# - WP8 C# 浏览器样式键盘

c# - 将回调方法作为参数传递

c# - 使用 Linq 基于属性对对象列表进行分组?

.net - LINQ GroupBy,将一对一列表转换为一对多

c# - 如何编写自己的基于XmlService 的ORM?

.net - 如何在运行时更改 LINQ O/R-M 表名/源?

c# - 运算符 "AND" "OR"SQL

c# - 存储库的通用 Linq 查找方法