首页 新闻 会员 周边

大侠们,请教个问题,关于再linq join 中 使用 like的

0
悬赏园豆:5 [已解决问题] 解决于 2018-07-30 13:44

大佬们,我想实现在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();
        }
    }

众生少两千的主页 众生少两千 | 初学一级 | 园豆:1
提问于:2018-01-30 22:19
< >
分享
最佳答案
3

不太懂你的意思,你是想内联还是子查询?如果是内联则可以这样写:

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要匹配的字段

收获园豆:5
龙行天涯 | 小虾三级 |园豆:1794 | 2018-01-31 09:20

大佬,就是join 那里不用 equals ,用 Contains

众生少两千 | 园豆:1 (初学一级) | 2018-01-31 11:12

我是想,from a in list1 join b in list2 on a.id contains b.id这种效果,但是这里没有contains

众生少两千 | 园豆:1 (初学一级) | 2018-01-31 11:13

@众生少两千:用equals是内联的语法结构,没有你写的这种写法。实在没清楚你到底想怎么样。或者你可以举两个实际的例子,然后给出你想要的结果,人家才好给你出方案,你这样只能让别人先猜你想干嘛

龙行天涯 | 园豆:1794 (小虾三级) | 2018-01-31 13:47

@龙行天涯: 哦哦。不好意思,大佬。。哈哈。。

比如 Table1 ,字段 A1,B1;Table2 字段A2,B2

A1中的值包含A2,最终想要得到的结果集合是 B1,B2

就这样。。谢了。

众生少两千 | 园豆:1 (初学一级) | 2018-01-31 14:09

@众生少两千: 先给你个sql的,你看是不是达到了你的需求:

select * from t2 where t2.a2 in (select a1 from t1)

龙行天涯 | 园豆:1794 (小虾三级) | 2018-01-31 15:01

@龙行天涯: 这个只能查出t2的字段吧?我是想t1,t2的字段都要。

我之前oracle sql 中实现过,这样的。

selec t1.B1,t2.B2 from t1

join t2 on t2.A2 like '%"||t1.A1||"%'

这样的

众生少两千 | 园豆:1 (初学一级) | 2018-01-31 15:11

@众生少两千: 我所知道的,linq里是实现不了你要的这种代码的,而且like查询只能针对字符串,不知你为何一定要这样做?这样做的目的是什么?

龙行天涯 | 园豆:1794 (小虾三级) | 2018-01-31 15:37

@龙行天涯: 是字符串。。只是遇到了这样的表结构。现在我在linq中是这样写的

from t1

from t2

where t2.A2.Contains(t1.A1)

select new {t1.B1,t2.B2}

这样能实现,但是感觉查询很慢

众生少两千 | 园豆:1 (初学一级) | 2018-01-31 15:58

@众生少两千: 如果不是超大级别的数据,这些所谓的感觉是可以忽略的,要是有觉得接受不了你这种感觉,那还可以直接用linq执行sql语句嘛。

龙行天涯 | 园豆:1794 (小虾三级) | 2018-01-31 16:14

@龙行天涯: 额。。好吧。。看来只有执行sql语句了。

众生少两千 | 园豆:1 (初学一级) | 2018-01-31 16:53
其他回答(1)
0

linq里的contains就相当于sql里的like

ll...ll | 园豆:233 (菜鸟二级) | 2018-01-31 08:58

我知道,我是想,from a in list1 join b in list2 on a.id contains b.id这种效果,但是这里没有contains

支持(0) 反对(0) 众生少两千 | 园豆:1 (初学一级) | 2018-01-31 11:13

@众生少两千: 这样呢  from a in list2 where (list1).Contains(a.id) selet a;

支持(0) 反对(0) ll...ll | 园豆:233 (菜鸟二级) | 2018-01-31 11:27

@lcqll: 这样达不到效果的,比如 Table1 ,字段 A1,B1;Table2 字段A2,B2

A1中的值包含A2,最终得到的结果集合是 B1,B2,所以只能是join吧?像你这样where的只能得到list2的字段的值吧?

支持(0) 反对(0) 众生少两千 | 园豆:1 (初学一级) | 2018-01-31 11:31

@众生少两千: 你用左外连接的话直接用equals,在用条件contains 你说的那种表现形式是可以的

支持(0) 反对(0) ll...ll | 园豆:233 (菜鸟二级) | 2018-01-31 11:58

@lcqll:啊,没看懂,大佬, 两张表没有 相等的 字段的哦。。用equals 关联没有值吧。

支持(0) 反对(0) 众生少两千 | 园豆:1 (初学一级) | 2018-01-31 12:01

@lcqll: 用where的话,最终的寄过只能是一张表吧?

支持(0) 反对(0) 众生少两千 | 园豆:1 (初学一级) | 2018-01-31 12:03
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册