Linq到left join导致“无法评估子节点”.错误

本文关键字:评估 子节点 错误 left join 导致 Linq | 更新日期: 2023-09-27 18:18:43

我试图在linQ中编写以下SQL查询:

select b.Title, b.Author from CurrentRented c left join Book b on c.BookId=b.BookId 
where c.UserId=2

我的linQ是:

var BooksRented = from c in db.CurrentRenteds
                    join b in db.Books on c.BookId equals b.BookId into bk
                    from b in bk.DefaultIfEmpty()
                    where c.UserId.Equals(UserID)
                    select new {
                        b.Title, b.Author, c.RentDate, c.ReturnDate};

然而,当我在Visual Studio 2010中调试时,我得到了一个"无法评估儿童"的错误。知道为什么我得到这个错误吗?

Linq到left join导致“无法评估子节点”.错误

扩展我的评论,这不是一个错误。你的查询看起来很好,但它一定是失败的,因为DefaultIfEmpty返回类型的默认值,当没有行匹配,所以你需要处理:-

 from b in bk.DefaultIfEmpty()
 where c.UserId.Equals(UserID)
 select new {
               Title = b != null ? b.Title : "",
               Author = b!= null ? b.Author : "",
               RentDate = c.RentDate, 
               ReturnDate = c.ReturnDate
            };

你必须在下面的DefaultIfEmpty Look中给出一个不同的别名。

var BooksRented = from c in db.CurrentRenteds
                    join b in db.Books on c.BookId equals b.BookId into bk
                    from d in bk.DefaultIfEmpty()
                    where c.UserId.Equals(UserID)
                    select new {
                        d.Title, d.Author, c.RentDate, c.ReturnDate};

我遇到过这个问题,当我在你的DbSet实体递归调用,包括不正确设计的属性。

简而言之,如果您使用实体框架作为ORM,请检查数据库中的外键和主键关系。因为有些表不工作,如果你有坏的键关系