C#List的join查询

有时需要用两个List做join查询,可以这样做

cs 复制代码
using System;
using System.Collections.Generic;
using System.Linq;

namespace SystemInfoCheck
{
    public class Program
    {
        public static void Main(string[] args)
        {
            //两个List进行join查询,然后根据条件进行进一步筛选,筛选中符合条件的A列表
            string bId = "1";//查询和Bid="1"关联的A列表
            List<A> list1 = new List<A>();
            list1.Add(new A { Id = "1" });
            list1.Add(new A { Id = "2" });
            list1.Add(new A { Id = "3" });
            list1.Add(new A { Id = "4" });

            List<BToA> list2 = new List<BToA>();
            list2.Add(new BToA { Id = "X1", AId = "1", BId = "1" });
            list2.Add(new BToA { Id = "X2", AId = "2", BId = "1" });
            list2.Add(new BToA { Id = "X3", AId = "3", BId = "2" });
            list2.Add(new BToA { Id = "X4", AId = "4", BId = "2" });

            List<A> result = (from a in list1
                              join btoa in list2 on a.Id equals btoa.AId
                              where btoa.BId == bId
                              select a).ToList();

            if (result != null && result.Count > 0)
            {
                result.ForEach(item =>
                { 
                    Console.WriteLine("AId="+item.Id);
                });
            }
            Console.ReadLine();
        }

        public class A
        {
            public string Id { get; set; }
        }

        public class BToA
        {
            public string Id { get; set; }

            public string AId { get; set; }

            public string BId { get; set; }
        }
    }
}

另外如果两个List都很大的情况,我个人非常不建议用join,还是老老实实多查几遍更快一些,像是这样:

cs 复制代码
using System;
using System.Collections.Generic;
using System.Linq;

namespace SystemInfoCheck
{
    public class Program
    {
        public static void Main(string[] args)
        {
            //两个List进行join查询,然后根据条件进行进一步筛选,筛选中符合条件的A列表
            string bId = "1";//查询和Bid="1"关联的A列表
            List<A> list1 = new List<A>();
            list1.Add(new A { Id = "1" });
            list1.Add(new A { Id = "2" });
            list1.Add(new A { Id = "3" });
            list1.Add(new A { Id = "4" });

            List<BToA> list2 = new List<BToA>();
            list2.Add(new BToA { Id = "X1", AId = "1", BId = "1" });
            list2.Add(new BToA { Id = "X2", AId = "2", BId = "1" });
            list2.Add(new BToA { Id = "X3", AId = "3", BId = "2" });
            list2.Add(new BToA { Id = "X4", AId = "4", BId = "2" });

            List<string> aIds = list2.Where(btoa => btoa.BId == bId).Select(b => b.AId).ToList();

            List<A> result = null;
            if (aIds != null && aIds.Count() > 0)
            {
                result = list1.Where(a => aIds.Contains(a.Id)).ToList();
            }

            if (result != null && result.Count > 0)
            {
                result.ForEach(item =>
                { 
                    Console.WriteLine("AId="+item.Id);
                });
            }

            Console.ReadLine();
        }

        public class A
        {
            public string Id { get; set; }
        }

        public class BToA
        {
            public string Id { get; set; }

            public string AId { get; set; }

            public string BId { get; set; }
        }
    }
}