2017-09-12 102 views
0

我有3个表(在原有6,但短越好这里) 他们都拥有一个共同的键列我想过滤和联合使用LINQ联盟表

所有这些表在这里我做了什么,到目前为止,实际上它的工作原理,但你会明白我为什么发布此,因为你看到下面

 var query = (from icr in ictetkikRadyoloji 
           where icr.CommanId == userId         
           select new MyCustomModel 
           { 

            ID = icr.ID, 
            IstemTarihi = icr.IstemTarihi, 
            Laboratuvar = icr.Laboratuvar, 
            Sonuc = icr.Sonuc, 
            HastaGuid = "-", 
            Type_ = "1" 
           }).Union(from icb in ictetkikBakteriyoloji 
              where icb.CommanId == userId          select new MyCustomModel 
              { 

               ID = icb.ID, 
               IstemTarihi = icb.IstemTarihi, 
               Laboratuvar = icb.Laboratuvar, 
               Sonuc = "-", 
               HastaGuid ="someGuid", 
               Type_ = "2" 
              }).Union(from icbk in ictetkikBiyokimya 
                where icbk.CommanId == userId            select new MyCustomModel 
                { 

                 ID = icbk.ID, 
                 IstemTarihi = DateTime.Now, 
                 Laboratuvar = icbk.Laboratuvar, 
                 Sonuc = "-", 
                 HastaGuid ="SomeGuid", 
                 Type_ = "3" 
                }); 

你看它那么丑陋和比这个丑陋的起源:(我怎样才能使代码这一点更美丽,因为他们都返回实体作为具体的模型(MyCustomModel) 我觉得它可以..

回答

2

您可以先执行投影,然后在所有情况下合并。投影应该具有的唯一附加数据是CommanId。您可以使用anonymous types,因此您不必为中间投影创建另一个类。之后,您可以指定您的过滤器一次,然后进行最终投影到MyCustomModel

例如:

var unionQuery = (from icr in ictetkikRadyoloji 
        select new 
        { 
         ID = icr.ID, 
         IstemTarihi = icr.IstemTarihi, 
         Laboratuvar = icr.Laboratuvar, 
         Sonuc = icr.Sonuc, 
         HastaGuid = "-", 
         Type_ = "1", 
         CommanId = icr.CommanId 
        }).Union(
        (from icb in ictetkikBakteriyoloji 
        select new 
        { 

         ID = icb.ID, 
         IstemTarihi = icb.IstemTarihi, 
         Laboratuvar = icb.Laboratuvar, 
         Sonuc = "-", 
         HastaGuid = "someGuid", 
         Type_ = "2", 
         CommanId = icb.CommanId 
        })).Union(
        (from icbk in ictetkikBiyokimya 
        select new 
        { 

         ID = icbk.ID, 
         IstemTarihi = DateTime.Now, 
         Laboratuvar = icbk.Laboratuvar, 
         Sonuc = "-", 
         HastaGuid = "SomeGuid", 
         Type_ = "3", 
         CommanId = icbk.CommanId 
        })); 

var query = from i in unionQuery 
      where i.CommanId = userId 
      select new MyCustomModel 
      { 
       ID = i.ID, 
       IstemTarihi = i.IstemTarihi, 
       Laboratuvar = i.Laboratuvar, 
       Sonuc = "-", 
       HastaGuid = "SomeGuid", 
       Type_ = "3", 
      }; 

另外,您可以添加属性CommanIdMyCustomModel,然后你不需要最终投影和匿名类型。

1

你有两种选择:通过对象

负载对象的内存,使3个不同的副本列表

  var query = (from icr in ictetkikRadyoloji 
      where icr.CommanId == userId 
      select new List<MyCustomModel>() 
      { 
       new MyCustomModel() 
       { 

        ID = icr.ID, 
        IstemTarihi = icr.IstemTarihi, 
        Laboratuvar = icr.Laboratuvar, 
        Sonuc = icr.Sonuc, 
        HastaGuid = "-", 
        Type_ = "1" 
       }, 
       new MyCustomModel 
       { 

        ID = icb.ID, 
        IstemTarihi = icb.IstemTarihi, 
        Laboratuvar = icb.Laboratuvar, 
        Sonuc = "-", 
        HastaGuid = "someGuid", 
        Type_ = "2" 
       }, 
       new MyCustomModel 
       { 

        ID = icbk.ID, 
        IstemTarihi = DateTime.Now, 
        Laboratuvar = icbk.Laboratuvar, 
        Sonuc = "-", 
        HastaGuid = "SomeGuid", 
        Type_ = "3" 
       } 
      }); 

2.使用循环

1.获取列表每个对象。

 var result = new List<MyCustomModel>(); 
     var query = (from icr in ictetkikRadyoloji 
       where icr.CommanId == userId 
       select icr) 
      .ToList() 
      .ForEach(x => 
      { 
       result.Add(new MyCustomModel() 
       { 

        ID = icr.ID, 
        IstemTarihi = icr.IstemTarihi, 
        Laboratuvar = icr.Laboratuvar, 
        Sonuc = icr.Sonuc, 
        HastaGuid = "-", 
        Type_ = "1" 
       }); 

       result.Add(new MyCustomModel() 
       { 

        ID = icr.ID, 
        IstemTarihi = icr.IstemTarihi, 
        Laboratuvar = icr.Laboratuvar, 
        Sonuc = "-", 
        HastaGuid = "someGuid", 
        Type_ = "2" 
       }); 

       result.Add(new MyCustomModel() 
       { 

        ID = icr.ID, 
        IstemTarihi = DateTime.Now, 
        Laboratuvar = icr.Laboratuvar, 
        Sonuc = "-", 
        HastaGuid = "SomeGuid", 
        Type_ = "3" 
       }); 

      });