"Выражение аргумента недопустимо" с запросом субвыбора EF4 Linq
Любые идеи относительно того, почему этот запрос компилируется, но затем выдает эту ошибку времени выполнения:
Выражение аргумента недопустимо
Я знаю, что могу изменить свою модель БД, но в этом случае это невозможно. Есть идеи, как сделать так, чтобы это работало? Даже не уверен, как это будет называться. Благодарю.
DBContext db = new DBContext();
var books = (from b in db.BOOKS
select new
{
b.ID,
b.NAME,
AuthorName = db.PEOPLEs.Where(p=>p.ID==b.AUTHOR).First().USER_ID,
}).ToList();
4 ответа
Я обнаружил, что мне больше всего повезло со сложными внутренними запросами, используя выражения let. Это делает отбор и позволяет вам более гибко связывать элемент из отборов. ОДНАКО, обратите внимание, что я делаю First() только для назначения автора в анонимном объекте. Это потому, что если вы сделаете First().PropertyName и First выдаст нулевое значение, оно взорвется.
Удачи и перепроверьте синтаксис. У меня нет полного набора объектов, поэтому я не могу сгенерировать полностью работающую демонстрацию, однако, это было протестировано с деревом объектов, которое у меня есть в одном из моих собственных проектов.
var books = (
from b in db.BOOKs
let author = (from a in db.PEOPLEs
where b.AUTHOR == a.ID
select a)
select new
{
ID = b.ID,
NAME = b.Name,
Author = author.First()
}
).ToList();
foreach(var x in books)
{
string AuthorName = x.Author.USER_ID;
//Do other stuff
}
Тем не мение, First<T>()
также есть перегрузка First<T>(Predicate<T>)
т.е.
AuthorName = db.PEOPLEs.First(p=>p.ID==b.AUTHOR).USER_ID
Вы можете использовать LINQ в стилях методов:
var books = (from b in db.BOOKS
let author = db.PEOPLEs.Where(p => p.ID == b.AUTHOR).First()
select new
{
b.ID,
b.NAME,
AuthorName = author.USER_ID,
}).ToList();
Если вы посмотрите на свой код, у вас есть
DBContext db = new DBContext();
var books = (from b in db.BOOKS
select new
{
b.ID,
b.NAME,
AuthorName = db.PEOPLEs.Where(p=>p.ID==b.AUTHOR).First().USER_ID, <<-- Here coma
}).ToList();
Там ожидается другой параметр, просто удалите его, и он должен пройти
:)
Итак, окончательное решение было:
var books = (
from b in db.BOOKs
let author = (from a in db.PEOPLEs
where b.AUTHOR == a.ID
select a)
select new
{
ID = b.ID,
NAME = b.Name,
Author = author.First().USER_ID
}
).ToList();
Спасибо!