"Выражение аргумента недопустимо" с запросом субвыбора 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();

Спасибо!

Другие вопросы по тегам