0

关于此查询为何编译但随后引发此运行时错误的任何想法:

参数表达式无效

我知道我可以更改我的数据库模型,但在这种情况下这是不可能的。任何想法如何让这样的事情工作?甚至不确定这会叫什么。谢谢。

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

4 回答 4

1

我发现使用 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
}
于 2011-03-07T20:54:16.300 回答
0

无论如何,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();
于 2011-03-07T20:45:51.500 回答
0

如果你看看你的代码,你有

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

它期望那里有另一个参数,只需将其删除即可通过

:)

于 2011-03-07T21:06:25.307 回答
0

所以,最终的解决方案是:

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

谢谢!

于 2011-03-07T21:47:13.560 回答