大佬们,我想实现在linq中join两张表,不是根据两表的某个字段相等,而是A表中T1字段包含B表中T2字段,该怎么实现呢?我用Join方法中IEqualityComparer,但是没有效果。
比如下面这个语句,就不能达到效果,我发现貌似是先join之后,再执行的IEqualityComparer方法。。谢谢,大佬们。。。
class Program
{
static void Main(string[] args)
{
List<Model1> list1 = new List<Model1>();
for (int i = 0; i < 10; i++)
{
list1.Add(new Model1() { id = i, name = "name" + i });
}
List<Model1> list2 = new List<Model1>();
for (int i = 10; i < 20; i++)
{
list2.Add(new Model1() { id = i, name = "name" + i });
}
list2.Add(new Model1() { id = 100, name = "name1,name2,name3" });
list2.Add(new Model1() { id = 101, name = "name5,name6" });
list2.Add(new Model1() { id = 102, name = "name7,name4" });
var list = list2.Join(list1, l2 => l2.name, l1 => l1.name, (l1, l2) => new { l1 }, new EqualityComparer());
Console.ReadKey();
}
}
class Model1
{
public int id { get; set; }
public string name { get; set; }
}
class EqualityComparer : IEqualityComparer<string>
{
public bool Equals(string x, string y)
{
return x.Contains(y);
}
public int GetHashCode(string obj)
{
return obj.GetHashCode();
}
}
不太懂你的意思,你是想内联还是子查询?如果是内联则可以这样写:
from a in list1 join b in list2 on a.id equals b.aid select 结果;
如果是子查询,则可以这样:
from a in list2 where (new int[]{1,2,3}).Contains(a.id) selet a;
其中new int[]{1,2,3}是list2要匹配的字段
大佬,就是join 那里不用 equals ,用 Contains
我是想,from a in list1 join b in list2 on a.id contains b.id这种效果,但是这里没有contains
@众生少两千:用equals是内联的语法结构,没有你写的这种写法。实在没清楚你到底想怎么样。或者你可以举两个实际的例子,然后给出你想要的结果,人家才好给你出方案,你这样只能让别人先猜你想干嘛
@龙行天涯: 哦哦。不好意思,大佬。。哈哈。。
比如 Table1 ,字段 A1,B1;Table2 字段A2,B2
A1中的值包含A2,最终想要得到的结果集合是 B1,B2
就这样。。谢了。
@众生少两千: 先给你个sql的,你看是不是达到了你的需求:
select * from t2 where t2.a2 in (select a1 from t1)
@龙行天涯: 这个只能查出t2的字段吧?我是想t1,t2的字段都要。
我之前oracle sql 中实现过,这样的。
selec t1.B1,t2.B2 from t1
join t2 on t2.A2 like '%"||t1.A1||"%'
这样的
@众生少两千: 我所知道的,linq里是实现不了你要的这种代码的,而且like查询只能针对字符串,不知你为何一定要这样做?这样做的目的是什么?
@龙行天涯: 是字符串。。只是遇到了这样的表结构。现在我在linq中是这样写的
from t1
from t2
where t2.A2.Contains(t1.A1)
select new {t1.B1,t2.B2}
这样能实现,但是感觉查询很慢
@众生少两千: 如果不是超大级别的数据,这些所谓的感觉是可以忽略的,要是有觉得接受不了你这种感觉,那还可以直接用linq执行sql语句嘛。
@龙行天涯: 额。。好吧。。看来只有执行sql语句了。
linq里的contains就相当于sql里的like
我知道,我是想,from a in list1 join b in list2 on a.id contains b.id这种效果,但是这里没有contains
@众生少两千: 这样呢 from a in list2 where (list1).Contains(a.id) selet a;
@lcqll: 这样达不到效果的,比如 Table1 ,字段 A1,B1;Table2 字段A2,B2
A1中的值包含A2,最终得到的结果集合是 B1,B2,所以只能是join吧?像你这样where的只能得到list2的字段的值吧?
@众生少两千: 你用左外连接的话直接用equals,在用条件contains 你说的那种表现形式是可以的
@lcqll:啊,没看懂,大佬, 两张表没有 相等的 字段的哦。。用equals 关联没有值吧。
@lcqll: 用where的话,最终的寄过只能是一张表吧?