Linq To Sql进阶系列(二)M:M关系
系列文章导航:
Linq To Sql进阶系列(四)User Define Function篇
Linq To Sql进阶系列(五)Store Procedure篇
Linq To Sql进阶系列(六)用object的动态查询与保存log篇
Linq To Sql进阶系列(七)动态查询续及CLR与SQL在某些细节上的差别
为了不破坏数据库的映射,我们把这部分改动放到partial class中。这样,我们渴望实现user.Group。
我们来做个测试,看看是不是成功了呢。
public static void Main(string[] arg)
{
DataClasses1DataContext db = new DataClasses1DataContext();
db.Log = Console.Out;
var userSet = (from u in db.Users
select u).ToList();
foreach (var use in userSet)
{
foreach (var group in use.Groups)
{
Console.WriteLine(group.GroupName);
}
}
var groupSet = (from u in db.Groups
select u).ToList();
foreach (var group in groupSet)
{
foreach (var user in group.Users)
{
Console.WriteLine(user.UserName);
}
}
}
太好了。这正是我们想要的。那再来做个反面的测试吧。
var q = (from u in db.Users
from g in u.Groups
select new { u.UserName, g.GroupName }).ToList();
from g in u.Groups
select new { u.UserName, g.GroupName }).ToList();
编译通过,在run-time时,出错。因为,Linq To Sql不知道该怎么去找这个关系。那么下面这个呢?
var q2 = (from u1 in (from u in db.Users
select u).ToList()
from g in u1.Groups
select new { u1.UserName, g.GroupName }).ToList();
select u).ToList()
from g in u1.Groups
select new { u1.UserName, g.GroupName }).ToList();
run-time没有问题。纠起原因,其在里面已经取回了数据,是Linq To Object的范畴了。
还可以使用下面的这个映射code。
using System.Data.Linq;
using System.Data.Linq.Mapping;
using System.Data;
using System.Collections.Generic;
using System.Reflection;
using System.Linq;
using System.Linq.Expressions;
using System.Runtime.Serialization;
using System.ComponentModel;
using System;
namespace ConsoleApplication1
{
public partial class Group
{
public IEnumerable<User> Users
{
get
{
return from u in this.UserInGroups
select u.User;
}
}
}
public partial class User
{
public IEnumerable<Group> Groups
{
get
{
return from g in this.UserInGroups
select g.Group;
}
}
}
}
结合我们的测试例子,请大家仔细比较他们的区别哦。前面那个是一次性取出了。后面这个是用那个取那个。