[LINQ] join多个条件

symbol_bc 2010-12-20 12:02:35

public class Student
{
int ID {get; set;}
int UID {get; set;}
string Name {set; get;}
}

List<Student> s1 = new List<Student>();
List<Student> s2 = new List<Student>();

join规则 s1.ID == s2.UID && s1.UID == s2.ID
怎么写?

from g in s1
join f in s2 on new { s1.ID, s1.UID } equals new { s2.UID, s2.ID } into h
select g;
这样不对!

var interace = from g in s1
join f in s2 on new { s1.UserID, s1.PartnerUserID } equals new { s2.PartnerUserID, s2.UserID } into h
from c in h.DefaultIfEmpty()
select new
{
g
};

这样写也不对!

应该怎么写???
...全文
785 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
symbol_bc 2010-12-20
  • 打赏
  • 举报
回复
对了,tim,这默认是内连接吧,怎样实现左连接
机器人 2010-12-20
  • 打赏
  • 举报
回复
@_@ 不会吧。

我这里没问题。你的class Student属性的Public加上了吗?

symbol_bc 2010-12-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 fangxinggood 的回复:]
C# code
class Program
{
static void Main(string[] args)
{
var s1 = GetData1();
var s2 = GetData2();

var query = from e1 in s1
……
[/Quote]

你这个能编译通过吗?
我在这里
var query = from e1 in s1
join e2 in s2
on new { e1.ID, e1.UID } equals new { e2.ID, e2.UID }
select e1;

就说join的调用推理类型失败!
机器人 2010-12-20
  • 打赏
  • 举报
回复
这里不要 into h
select g 不会从h里取。
机器人 2010-12-20
  • 打赏
  • 举报
回复
class Program
{
static void Main(string[] args)
{
var s1 = GetData1();
var s2 = GetData2();

var query = from e1 in s1
join e2 in s2
on new { e1.ID, e1.UID } equals new { e2.ID, e2.UID }
select e1;

foreach (var e in query.ToList())
Console.WriteLine(e.ToString());

Console.Read();
}

static List<Student> GetData1()
{
var data = new List<Student>
{
new Student {ID = 1, UID = 1, Name = "Data1_1"},
new Student {ID = 2, UID = 2, Name = "Data1_2"},
new Student {ID = 3, UID = 3, Name = "Data1_3"},
new Student {ID = 4, UID = 4, Name = "Data1_4"}
};
return data;
}

static List<Student> GetData2()
{
var data = new List<Student>
{
new Student {ID = 2, UID = 2, Name = "Data1_2"},
new Student {ID = 3, UID = 3, Name = "Data1_3"},
new Student {ID = 5, UID = 5, Name = "Data1_5"}
};
return data;
}
}

class Student
{
public int ID { get; set; }
public int UID { get; set; }
public string Name { set; get; }
public override string ToString()
{
return string.Format("[ID:{0}],[UID:{1}],[Name:{2}]", ID, UID, Name);
}
}
q107770540 2010-12-20
  • 打赏
  • 举报
回复
是的 可以这么理解
symbol_bc 2010-12-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 q107770540 的回复:]
C# code

var query=from g in s1
join f in s2
on new { ID1=g.ID, ID2=g.UID } equals new { ID1=f.UID, ID2=f.ID } into h
select g;
[/Quote]

弄了好长时间,原来是没有给他们重命名,就是说要为他们提供一个显式的映射关系,我还以为他们可以根据顺序自己映射呢?是这样吧,Tim。

  • 打赏
  • 举报
回复
嗯,上面你的左连接条件中的&&写错了,应该为
var interace = from g in s1
join f in s2 on g.ID equals f.UID into h
from c in h.DefaultIfEmpty()
where c==null || g.UID== c.ID
select new
{
g
};
  • 打赏
  • 举报
回复
实际上,当有两条件需要比较,那么哪一个写在前边、哪一个写在后边,哪一个变量写在表达式左边、哪一个写在右边,这是要根据索引状况进行分析的。有索引的应该写在左边,并且首先写在前边的表达式得到的匹配结果记录应该尽可能少。
  • 打赏
  • 举报
回复
var interace = from g in s1
join f in s2 on g.ID equals f.UID into h
from c in h.DefaultIfEmpty()
where c!=null && g.UID== c.ID
select new
{
g
};


不过,把你的原始class定义代码写好,你的那个根本没法编译通过。
q107770540 2010-12-20
  • 打赏
  • 举报
回复

var query=from g in s1
join f in s2
on new { ID1=g.ID, ID2=g.UID } equals new { ID1=f.UID, ID2=f.ID } into h
select g;
q107770540 2010-12-20
  • 打赏
  • 举报
回复

void Main()
{
var s1 = GetData1();
var s2 = GetData2();

var query=from g in s1
join f in s2
on new { ID1=g.ID, ID2=g.UID } equals new { ID1=f.UID, ID2=f.ID } into h
from h1 in h.DefaultIfEmpty()
select h1;

query.ToList().ForEach(q=>Console.WriteLine(q==null?"":q.ToString()));

/*
[ID:2],[UID:1],[Name:Data1_2]

[ID:2],[UID:3],[Name:Data1_3]

*/

}

List<Student> GetData1()
{
var data = new List<Student>
{
new Student {ID = 1, UID = 2, Name = "Data1_1"},
new Student {ID = 2, UID = 2, Name = "Data1_2"},
new Student {ID = 3, UID = 2, Name = "Data1_3"},
new Student {ID = 4, UID = 4, Name = "Data1_4"}
};
return data;
}

List<Student> GetData2()
{
var data = new List<Student>
{
new Student {ID = 2, UID = 1, Name = "Data1_2"},
new Student {ID = 2, UID = 3, Name = "Data1_3"},
new Student {ID = 5, UID = 5, Name = "Data1_5"}
};
return data;
}
class Student
{
public int ID { get; set; }
public int UID { get; set; }
public string Name { set; get; }
public override string ToString()
{
return string.Format("[ID:{0}],[UID:{1}],[Name:{2}]", ID, UID, Name);
}
}
q107770540 2010-12-20
  • 打赏
  • 举报
回复
try:

var query=from g in s1
join f in s2
on new { ID1=g.ID, ID2=g.UID } equals new { ID1=f.UID, ID2=f.ID } into h
from h1 in h.DefaultIfEmpty()
select h1;

symbol_bc 2010-12-20
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 fangxinggood 的回复:]
@_@ 不会吧。

我这里没问题。你的class Student属性的Public加上了吗?
[/Quote]

哦,我知道了,new内部的程序顺序必须一致,才可以,可是这样一致对比的是相同
名字的成员,而我想比的是id和uid。不错!
机器人 2010-12-20
  • 打赏
  • 举报
回复
如果 into h 的话,要加上:

var query = from e1 in s1
join e2 in s2
on new { e1.ID, e1.UID } equals new { e2.ID, e2.UID } into h
from s in h
select s;

8,494

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧