Значения одинаковы, но имена отличаются с помощью 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())}]";