2014-09-17 2 views
0

Я новичок в sql-linq, и я пытаюсь объединить две таблицы, используя их общий идентификатор, который является MOTHERID. Но приведенный ниже код бросает «Недопустимое исключение литья» по адресу:Code throws Неверное исключение литья: linq-sql соединяет две таблицы

var firstQuery = (из s в _maternalvisitvaluedb.Value select s) .ToList();

и весь код выглядит как:

var firstQuery = (from s in _maternalvisitvaluedb.Value select s).ToList(); 
var secondQuery = (from t in _maternalcarevaluedb.Value select t).ToList(); 

var result = (from s in firstQuery 
join k in secondQuery 
on s.MotherId equals k.MotherId 
where (DateTime)s.SecondVisit.Date == DateTime.Now.Date 
select s).ToList(); 

Спасибо за вашу помощь!

+0

, где имеет место исключение и какого типа будут ваши значения получены в запросах? – HimBromBeere

+0

Что такое 's.SecondVisit.Date' и почему вам нужно отдать его в' DateTime'? Это 'Nullable '? – Dirk

+0

Можете ли вы опубликовать, где вы получаете исключение вместе с любой соответствующей информацией? – 2014-09-17 13:09:26

ответ

1

s не типа DateTime, удалить бросание из запроса, и это должно исправить.

Изменить

where (DateTime)s.SecondVisit.Date == DateTime.Now.Date 

к

where s.SecondVisit.Date == DateTime.Now.Date 
+0

Если бросок не подходит, то зачем делать сравнение без литья, даже иметь смысл? – Dirk

+0

Поскольку s не относится к типу DateTime. При попытке передать s в DateTime он получает недопустимое исключение. Я предполагаю, что в запросе Linq s будет иметь правильный тип. Если это предположение не задержится, ему придется отбросить соответствующий объект. Ответ мой хорошо быть (() s) .SecondVisit.Date, но на основе кода в вопросе, я думаю, что удаление броска решит проблему. Честно говоря, без дополнительной информации каждый ответ здесь - всего лишь догадка. – 2014-09-17 13:05:07

+0

исключение не выбрасывается из-за кастинга Datetime. Это из-за toList(). функция. – afom

0

вы можете использовать

var result = (from s in firstQuery 
join k in secondQuery 
on s.MotherId equals k.MotherId 
where DateTime.Compare(s.SecondVisit.Date, DateTime.Now.Date)<=0 
select s).ToList(); 
+0

DateTime.Compare принимает 2 параметра DateTime. Если приведение происходит неудачно, это не будет даже компилироваться. – Dirk

0

код ниже бросает исключение "Недопустимый слепок" на первой линии .

Похоже, вы не выбрали правильную таблицу из базы данных «_maternalvisitvaluedb» который дает ошибку.

'_maternalvisitvaluedb.Value' выглядит как свойство базы данных и не является таблицей в базе данных. Убедитесь, что это таблица.

+0

ошибка генерируется при "var firstQuery = (из s в _maternalvisitvaluedb.Value select s) .ToList();". – afom

0

Вы можете попробовать использовать Equals() вместо (который будет принимать NULLABLE DateTime значения)

var result = (from s in firstQuery 
join k in secondQuery 
on s.MotherId equals k.MotherId 
where DateTime.Now.Date.Equals(s.SecondVisit.Date) 
select s).ToList(); 

отметить также, что вы загружаете обе таблицы в памяти. Вы может быть в состоянии сделать запрос в SQL, если вы не делаете промежуточные запросы:

var result = (from s in _maternalvisitvaluedb.Value 
       join k in _maternalcarevaluedb.Value 
        on s.MotherId equals k.MotherId 
       where DateTime.Now.Date.Equals(s.SecondVisit.Date) 
       select s) 
       .ToList(); 

Компромисс будет сделать присоединиться в SQL и фильтра в Linq к объектам

var result = (from s in _maternalvisitvaluedb.Value 
       join k in _maternalcarevaluedb.Value 
        on s.MotherId equals k.MotherId 
       select new {s, k}) 
      .Where(sk => DateTime.Now.Date.Equals(s.SecondVisit.Date) 
      .Select(sk => sk.s).ToList(); 
+0

Последнее предложение не применяется, поскольку firstQuery и secondQuery материализуются в списки. – Dirk

+0

@ Dirk Спасибо. Я добавил несколько предложений, чтобы избежать загрузки обеих таблиц в память. –

+0

Когда я пытаюсь сделать это, проблема исчезла, но она порождает другое другое исключение: «Запрос содержит ссылки на элементы, определенные в другом контексте данных». Заранее благодарны за Вашу помощь. – afom

0

Я знаю, что первоначальный вопрос был дан ответ, но в случае, если кто-либо другой врезается в это ... Я потратил навсегда на это и решить ее путем изменения

on (Int64)table1["myField"] equals (Int64)table2["myField"] 

в

on Convert.ToInt64(table1["myField"]) equals Convert.ToInt64(table2["myField"]) 
Смежные вопросы