首页 新闻 赞助 找找看

一个linq的数据匹配问题,类似左连接。

0
悬赏园豆:20 [已解决问题] 解决于 2019-05-06 14:29

我有一个结果,按理说这里只是个表达式。如下:

var query=from m in db.Student
select new{
id=m.id,
name=m.name
}
//有一个要被匹配的数组
string[]arr={"小张","小红","小明"};

        //这里要做的是,从query中匹配出包含arr中人名的信息。若arr中有的人名没匹配到,则id设为-1。(类似于一个arr的左连接)
        //最好还是用query来接收这个结果。我这里只能匹配出一致的那部分,arr中不在query中的那部分怎么显示出来,并设置id=-1呢。

query=query.where(m=>arr.contains(m.name))

或者您有其他设计方案,麻烦告知,初学linq,万分感谢!

一禅·小和尚的主页 一禅·小和尚 | 小虾三级 | 园豆:519
提问于:2019-04-24 09:06
< >
分享
最佳答案
0

这样:

//测试数据
List<Student> lst = new List<Student>
{
    new Student{ id = 1, name = "小丽"},
    new Student{ id = 2, name = "小红"},
    new Student{ id = 3, name = "小明"},
};
var query = from m in lst
            select new
            {
                m.id,
                m.name
            };
string[] arr = { "小张", "小红", "小明" };

List<Student> temp = new List<Student>();
Student model;
for (int i = 0; i < arr.Length; i++)
{
    //把不存在的加进去
    if (!query.Any(q => q.name == arr[i]))
    {
        model = new Student
        {
            id = -1,
            name = arr[i]
        };
        temp.Add(model);
    }
}
var query1 = from t in temp
             select new
             {
                 t.id,
                 t.name
             };

query = query.Union(query1);//合并
var dd = query.ToList();
//打印结果
for (int i = 0; i < dd.Count; i++)
{
    Console.WriteLine(dd[i].id + "----" + dd[i].name);
}
收获园豆:20
三人乐乐 | 老鸟四级 |园豆:4819 | 2019-04-24 11:11

好的,谢谢。你的lst应该就是指的query.where(m=>arr.contains(m.name))后的数据吧。遍历数组,取出不在部分。不过query.Any(q => q.name == arr[i])这句会不会一直链接库。因为他是在循环里,而这种写法只要有数据要被使用就要链库吧?

一禅·小和尚 | 园豆:519 (小虾三级) | 2019-04-24 15:11
其他回答(1)
0

怎么把一头大象装进冰箱?

  • 先用条件找出一致的数据,这是数据库查询
var query=from m in db.Student
where arr.contains(m.name)
select new{
id=m.id,
name=m.name
}
  • 在内存中进行左连接。代码我就不写了,因为你可以搜索。
爱编程的大叔 | 园豆:30839 (高人七级) | 2019-04-24 09:27

先找出一致的信息,然后再从数组中根据一致的,找出剩余的对不?
query这里暂时不能tolist();因为我后面还有很多代码都是用的query,tolist之后,后面的就都得变。

支持(0) 反对(0) 一禅·小和尚 | 园豆:519 (小虾三级) | 2019-04-24 09:29
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册