有关此查询编译原因的任何想法,但随后会抛出此运行时错误:
参数表达式无效
我知道我可以更改我的数据库模型,但在这种情况下,它是不可能的。 任何想法如何让这样的工作?甚至不确定这会被称为什么。感谢。
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();
答案 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();
谢谢!