Linq中使用 外連線和右連線

2021-08-02 11:21:46 字數 4226 閱讀 1971

use test

create table student(

id int identity(1,1) primary key,

[name] nvarchar(50) not null

)create table book(

id int identity(1,1) primary key,

[name] nvarchar(50)not null,

studentid int not null

)insert into student values('張三')

insert into student values('李四')

insert into student values('王五')

select * from student

--張三借的書

insert into book values('紅樓',1)

insert into book values('大話紅樓',1)

--李四借的書

insert into book values('三國',2)

--王五沒借書

--一本錯誤的記錄

insert into book values('錯誤時怎樣練成的',111)

--左連線

select s.name,b.name from student as s

left join book as b on s.id=b.studentid

--右連線

select s.name,b.name from student as s

right join book as b on s.id=b.studentid

要用linq實現左連線,寫法如下

dataclasses1datacontext db = new dataclasses1datacontext();

var leftjoinsql = from student in db.student

join book in db.book on student.id equals book.studentid into temp

from tt in temp.defaultifempty()

select new

;

用linq實現右連線,寫法如下

dataclasses1datacontext db=new dataclasses1datacontext();

var rightjoinsql = from book in db.book

join stu in db.student on book.studentid equals stu.id into jointemp

from tmp in jointemp.defaultifempty()

select new ;

附加:

datatable dttable = new datatable();

datatable dttable2 = new datatable();

datarow row;

datarow row2;

dttable.columns.add("id", typeof(string));

dttable.columns.add("age", typeof(string));

dttable.columns.add("city", typeof(string));

dttable2.columns.add("id", typeof(string));

dttable2.columns.add("age", typeof(string));

dttable2.columns.add("city", typeof(string));

row = dttable.newrow();

row[0] = "001";

row[1] = "2012-01-01";

row[2] = "bj";

dttable.rows.add(row);

row = dttable.newrow();

row[0] = "001";

row[1] = "2012-01-01";

row[2] = "tj";

dttable.rows.add(row);

row = dttable.newrow();

row[0] = "001";

row[1] = "2012-01-01";

row[2] = "hb";

dttable.rows.add(row);

row = dttable.newrow();

row[0] = "002";

row[1] = "2012-01-01";

row[2] = "sz";

dttable.rows.add(row);

row = dttable.newrow();

row[0] = "002";

row[1] = "2012-01-01";

row[2] = "hg";

dttable.rows.add(row);

row = dttable.newrow();

row[0] = "003";

row[1] = "2012-01-01";

row[2] = "sz";

dttable.rows.add(row);

row = dttable.newrow();

row[0] = "004";

row[1] = "2012-01-01";

row[2] = "sz";

dttable.rows.add(row);

row2 = dttable2.newrow();

row2[0] = "001";

row2[1] = "2011-01-01";

row2[2] = "gz";

dttable2.rows.add(row2);

row2 = dttable2.newrow();

row2[0] = "001";

row2[1] = "2011-01-01";

row2[2] = "tj";

dttable2.rows.add(row2);

row2 = dttable2.newrow();

row2[0] = "002";

row2[1] = "2012-01-01";

row2[2] = "sz";

dttable2.rows.add(row2);

listst = new list();

stu a1 = new stu();

var query = from s in dttable.select()

join c in dttable2.select() on s.field("id") equals c.field("id") into gc

from gci in gc.defaultifempty()

// where s.field("age") > ( gci == null ? 0 : gci.field("age"))

// where gci != null

where convert.todatetime(s.field("age")) > (gci == null ? convert.todatetime(null) : convert.todatetime(gci.field("age")))

select new

//,//b1=new,

s,gci,

};// foreach (var item in query.select(p => p.b1).distinct())

// foreach (var item in query.select(p => new ).distinct())

foreach (var item in query.select(p => p.gci).distinct())

console.writeline("///");

var vv = dttable.select().select(p => p.field("id")).except(dttable2.select().select(p => p.field("id")));

foreach (var item in vv.distinct())

關於左外連線和右外連線

當使用left join的時候 select from a left join b on a.id b.id 這時候a表中的資料會全部查詢出來,而b表中相匹配的也會出來如果沒有匹配的用null填充。a表在前b表在後。如果a b反過來,也是同樣道理。當使用right join select from ...

自然連線,外連線,左外連線,右外連線

1.自然連線 結果基於表r和s的笛卡爾乘積,取對應的r和s中相同屬性組都相同的值,同時相同屬性組只保留乙個 先來看圖示,2個表以及自然連線的結果 操作的步驟 1.1找出2個表中相同的屬性組 屬性a加上屬性b 1.2找相同屬性組中,相同的屬性值所對應的元組 相同的屬性值 1.2.相同屬性值對應的元組 ...

左連線 左外連線 右外連線

在之前,我對mssql中的內連線和外連線所得出的資料集不是很清楚。這幾天重新溫習了一下sql的書本,現在的思路應該是很清楚了,現在把自己的理解發出來給大家溫習下。希望和我一樣對sql的連線語句不太理解的朋友能夠有所幫助。發這麼菜的教程,各位大大們別笑話偶了,呵 d 有兩個表a和表b。表a結構如下 a...