Значения одинаковы, но имена отличаются с помощью linq

Есть две таблицы в одном столбце таблицы FID. FID в таблице 'tblRe ' и введите в БД является строка, а в другом столбце таблицы MID . MID находится в таблице 'tblVeh' и введите db is int, оба значения одинаковы, но имена разные. я пытаюсь настроить, но это показывает ошибку

                string data = "[";
                var re = (from veh in DB.tblVeh
                          join regh in DB.tblRe on 
                          new{MID=veh .MID} equals new {MID=tblRe .FID}
                          where !(veh .VName == "")
                          group veh by veh .VName into g
                          select new
                          {
                              Name = g.Key,
                              cnt = g.Select(t => t.Name).Count()
                          }).ToList();


                   data += re.ToList().Select(x => "['" + x.Name + "'," + x.cnt + "]")
                  .Aggregate((a, b) => a + "," + b);

                  data += "]";

я пытаюсь это

 new{MID=veh .MID} equals new {MID=tblRe .FID}

ошибка

The type of one of the expressions in the join clause is incorrect. Type inference failed in the call to 'Join'.

любое решение

2 ответа

Решение

Будет сложно присоединиться, когда ключи будут разных типов. linq2sql должен быть в состоянии преобразовать ваш запрос в оператор SQL, чтобы иметь возможность его выполнить. Я думаю, что лучшим решением было бы извлечь строки интереса из БД и затем выполнить соединение. Таким образом, можно использовать любой код, поскольку его не нужно преобразовывать в sql.

        //Get the list of items from tblVeh
        var listOfVehs =
            (from veh in DB.tblVeh
             where !(veh.VName == "")
             select veh).ToList();
        //Get all MID from the vehs and convert to string.
        var vehMIDs = listOfVehs.Select(x => x.MID.ToString()).ToList();

        //Get all items from tblRe that matches.
        var listOfRes = (from re in DB.tblRe
                         where vehMIDs.Contains(re.FID)
                         select re).ToList();

        //Do a in code join
        var re = (
            from veh in listOfVehs
            join regh in listOfRes on veh.MID.ToString() equals regh.FID
            group veh by veh.VName into g
            select new
            {
               Name = g.Key,
              cnt = g.Select(t => t.Name).Count()
            }).ToList();

При выполнении объединения необходимо убедиться, что типы ключей совпадают. Поскольку вы объединяете одно свойство, анонимный объект не требуется, но типы должны совпадать. Было бы более целесообразно объединять строки, поэтому конвертируйте свойство в строку.

var query =
    from v in db.tblVeh
    join r in db.tblRe on Convert.ToString(v.MID) equals r.FID
    where v.VName != ""
    group 1 by v.VName into g
    select $"['{g.Key}',{g.Count()}]";
var data = $"[{String.Join(",", query.AsEnumerable())}]";
Другие вопросы по тегам