我有这张表和关系。
编辑
类(class)
public class Person
{
public Person()
{
Books = new HashSet<Book>();
}
public int PersonId { get; set; }
public string fname { get; set; }
public string lname { get; set; }
public string Company { get; set; }
public virtual ICollection<Book> Books { get; set; }
}
public class Book
{
public Book()
{
Persons = new HashSet<Person>();
}
public int BookId { get; set; }
public string Title { get; set; }
public virtual ICollection<Person> Persons { get; set; }
}
类(class)数据
{
lname = "Bar", fname = "Foo", Company = "FooBar", Books = { Title = "Book1" }, { Title = "Book2" }
}
人员表
+-------+-------+---------+----------+
| fname | lname | Company | PersonId |
+-------+-------+---------+----------+
| Foo | Bar | FooBar | 1 |
| Bob | Joe | Forest | 2 |
| Temp | Yoo | Temp | 3 |
+-------+-------+---------+----------+
图书表
+--------+-------+
| BookId | Title |
+--------+-------+
| 1 | Book1 |
| 2 | Book2 |
| 3 | Book3 |
+--------+-------+
PersonBook表
+----------+--------+
| PersonId | BookId |
+----------+--------+
| 1 | 2 |
| 1 | 1 |
| 2 | 1 |
+----------+--------+
结果
+----------+---------+------+
| Name | Company | Book |
+----------+--------+-------+
| Yoo, Temp| Temp | |
| Joe, Bob | Forest | Book1 |
| Bar, Foo | FooBar | Book1 |
| Bar, Foo | FooBar | Book2 |
+----------+--------+-------+
现在基本上,Person 和 Book 具有多对多的关系。我已经有一个 Sql 查询,但如何在 Linq 查询版本中执行此操作?
嗯,像这样:
select
(isnull(c.lname, '') + ', ' + isnull(c.fname, '')) as Name
,isnull(c.Company , '') as Company
,isnull(f.Book, '') as Book
from Person c
left join PersonBook cf
on c.PersonId = cf.PersonId
left join Book f
on f.BookId = cf.BookId
order by f.Title, c.lname
任何帮助将不胜感激!谢谢!
最佳答案
LINQ 中的左连接有点棘手,它需要 join into
和 DefaultIfEmpty
:
from p in db.People
join bj in db.Books on p.PersonId equals bj.PersonID into j
from b in j.DefaultIfEmpty()
select new { p.fName, p.lName, p.Company, b == null ? null : b.Title }
关于c# - 如何扁平化多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27674421/