繁体   English   中英

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

[英]“Argument expression is not valid” error with EF4 Linq sub select query

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

参数表达式无效

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

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

通过使用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();

谢谢!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM