我有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) 我觉得它可以...... ..
答案 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"
});
});