具有LINQ查询的联合表用于自定义模型

时间:2017-09-12 12:42:50

标签: entity-framework linq

我有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 个答案:

答案 0 :(得分: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",
            };

或者您可以将属性CommanId添加到MyCustomModel,然后您不需要最终投影和匿名类型。

答案 1 :(得分:1)

您有两种选择:

<强> 1。获取列表

            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。使用循环对象

将对象加载到内存中,并为每个对象制作3个不同的副本。

        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"
                });

            });