EF4 Linq子选择查询的“参数表达式无效”错误

时间:2011-03-07 20:38:50

标签: c# linq linq-to-sql exception-handling telerik-open-access

有关此查询编译原因的任何想法,但随后会抛出此运行时错误:

  

参数表达式无效

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

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 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:0)

无论如何,First<T>()也有overload 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();

答案 2 :(得分: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();

期待那里有另一个参数,只需删除它就可以传递

:)

答案 3 :(得分: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();

谢谢!