Ошибка «Выражение аргумента недопустимо» с запросом субвыбора EF4 Linq - PullRequest
0 голосов
/ 07 марта 2011

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

Недопустимое выражение аргумента

Я знаю, что могу изменить свою модель БД, но в этом случае это невозможно.Есть идеи, как сделать так, чтобы это работало?Даже не уверен, как это будет называться.Спасибо.

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 ]

1 голос
/ 07 марта 2011

Я обнаружил, что мне больше всего повезло со сложными внутренними запросами с помощью выражений 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
}
0 голосов
/ 08 марта 2011

Итак, окончательное решение было:

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();

Спасибо!

0 голосов
/ 08 марта 2011

Если вы посмотрите на свой код, у вас есть

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();

Он ожидает еще один параметр, просто удалите его, и он должен пройти

:)

0 голосов
/ 07 марта 2011

В любом случае, 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();
...