将两个不同类型的列表匹配在一起

Tan*_*ash 5 c# linq entity-framework

我有两张桌子,每张桌子都有自己的模型......

    class FamilyMan
    { 
        public int family_ID {get; set;}

        public string name {get; set;}
        public string fav_color {get; set;}
    }

    class BusinessMan
    {
        public int work_ID {get; set;}

        public string name {get; set;}
        public string fav_color {get; set;}

        //unrelated data etc
        public string job_title {get; set;}
    }
Run Code Online (Sandbox Code Playgroud)

...我希望能够将所有FamilyMans匹配到匹配的BusinessMans基于namefav_color.

我目前有类似的东西:

    //fill lists from database
    var family_list = dbContext.FamilyMen.ToList();
    var busy_list = dbContext.BusinessMen.ToList();
    //create empty dict for matching the two types
    var matches = new Dict<FamilyMan, BusinessMan>();


    foreach (FamilyMan fam_man in family_list) {
        foreach (BusinessMan busy_man in busy_list) {
            //if both names and colors match, consider them a matching
            //object and add them each to the dict
            if (fam_man.name == busy_man.name &&
                    fam_man.color == busy_man.color) {
                matches_MtO[fam_man] = busy_man;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

但是需要很长时间才能完成.

我还看了一个循环使用一个列表,foreach然后使用LINQs FirstOrDefault匹配它们,但效率似乎大致相同.

有没有更好的方法来匹配FamilyMans和BusinessMans?

Mat*_*ell 3

您应该使用 LINQ 的联接语法。这将使后端数据库进行匹配,并仅返回结果。

为了启用组合键上的联接,请遵循此处的 MSDN 指南。

var query = from fm in dbContext.FamilyMen
            join bm in dbContext.BusinessMen on 
                new { bm.name, bm.color } equals new { fm.name, fm.color }
            select new {
               FamilyMan = fm,
               BusinessMan = bm
            };

var resultList = query.ToList();
Run Code Online (Sandbox Code Playgroud)