Проблема в том, что анонимные типы в проекциях не идентичны ... Идентификатор: int
в одном и Nullable<int>
в другом.
Вместо использования анонимного типа в ваших проекциях используйте:
public class ConcatTarget
{
public DateTime TheDate {get;set;}
public int? ID {get;set;}
public string sale {get;set;}
public string lead {get;set;}
}
Несмотря на то, что экземпляры фактически не создаются, LinqToSql использует форму класса для перевода запроса.
Что касается Count
, возможно, вы имели в виду .Count(x => x.Prop != null)
?
Хорошо, очевидно, вы столкнулись с ошибочным поведением перевода, как описано здесь .
То, что происходит, - переводчик sql видит нулевые назначения и выбрасывает их. Это приводит к тому, что между наборами выбирается неверное количество столбцов sql.
Вот возможный обходной путь:
int? myNull = null;
var clicks =
from c in Clicks
select new mydata
{
date = c.ClickDate,
click = c.ID,
sale = c.ID + myNull,
lead = myNull + c.ID //note - expressions must be unique
};
Основная идея заключается в создании уникальных выражений, которые переводчик запросов не может выбросить. Это сложнее, чем кажется (выше моя девятая попытка).
Вот две другие таблицы:
var sales = from s in Sales
select new mydata
{
date = s.Date,
click = s.ID + myNull,
sale = s.ID,
lead = myNull + s.ID
};
var leads = from l in Leads
select new mydata
{
date = l.Date,
click = l.ID + myNull,
sale = myNull + l.ID,
lead = l.ID
};
Если у вас более двух столбцов, которые нужно обнулять, вы можете прибегнуть к вычитанию, делению, умножению и т. Д.