c# - 如何扁平化多对多关系

标签 c# linq linq-to-entities

我有这张表和关系。

编辑

类(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 intoDefaultIfEmpty:

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/

相关文章:

c# - 如何使用 linq 和 string.EndsWith(<1 of N items in an array>)

c# - Linq/删除空格返回实际值 'system.char'

c# - 为此排序 lambda 表达式

linq - 为什么 Entity Framework 在生成 SQL 时会忽略 Take() 方法?

c# - 浮点值在 Int 中丢失

c# - 在新的 AppDomain 中启动 WCF 服务以启用卷影复制(Windows 服务托管)

c# - 将两种扩展方法合二为一

mysql - Linq to Entities 中的 Sum 和 Ceiling

c# - 创建规则以对参数属性强制执行默认值

c# - 在 LINQ group by procedure 之后访问 List<T> 中保存的对象属性