C#中的LINQ查询?

4

我对C#和Linq编程世界还比较陌生。我想做类似于这样的事情,但是SubType是一个指向Type表的外键,我无法像这个例子那样实现:

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()。

有人能帮帮我吗?


2
尝试以下代码:var query = (from t in DataBase.Type join on st in DataBase.SubType.Where(x => x.SubTypeID == 3) on t.TypeID equal st.TypeID select new { type = t, subtype = st}).ToList() - jdweng
2个回答

1
你可以编写类似于SQL的连接查询。
from C in DataBase.Type
join s in DataBase.SubType.Where(s => s.Active && s.SubTypeId == SubTypeIDINT) on C.TypeID equals s.TypeID
select new DropdownModel()
    {
        ID = C.TypeID,
        Description = C.Name,
    }

1
你可以使用“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


1
出于性能方面的考虑,我选择了这个作为采纳的答案,谢谢! - Mr. White Night

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接