我写了以下linq查询:
using (var db = new CardContext())
{
var result = (from c in db.Creatures
orderby c.Name
select new CardDisplay()
{
ImgPath = c.Image,
CardType = c.CardType.Name,
Name = c.Name
}).ToList();
result.AddRange(from f in db.Fortunes
orderby f.Name
select new CardDisplay()
{
ImgPath = f.Image,
CardType = f.CardType.Name,
Name = f.Name
});
return View(result);
}
以下是表格:
我可以以某种方式改进我的查询,因此它将在1个查询中,而不是两个。正如你在表格图中看到的,我有更多的实体来提取所需的数据(共5个,其余未显示),因此会有更多的查询。或者可能是我,我做得对吗?还有一个问题,一般来说编写1个复杂的linq查询还是一些简单的问题会更好吗?
与Union的解决方案非常好,谢谢大家。但我希望Jonny Piazzi的界面解决方案能够奏效,也许我做错了。
答案 0 :(得分:3)
您应该可以使用联盟:
var result = (from c in db.Creatures
orderby c.Name
select new CardDisplay()
{
ImgPath = c.Image,
CardType = c.CardType.Name,
Name = c.Name
}).Union(
from f in db.Fortunes
orderby f.Name
select new CardDisplay()
{
ImgPath = f.Image,
CardType = f.CardType.Name,
Name = f.Name
}).ToList()
使用此单个查询,只会向数据库发出一个请求,而不是两个。
答案 1 :(得分:3)
您不需要将第一个结果转换为列表。 使用 Union LINQ运算符。
var resultFromCreatures = (from c in db.Creatures
orderby c.Name
select new CardDisplay()
{
ImgPath = c.Image,
CardType = c.CardType.Name,
Name = c.Name
});
var resultFromFortunes = (from f in db.Fortunes
orderby f.Name
select new CardDisplay()
{
ImgPath = f.Image,
CardType = f.CardType.Name,
Name = f.Name
});
var result = resultFromCreatures.Union(resultFromFortunes);
答案 2 :(得分:1)
如果您使用Code First,您可以使用界面,如下所示:
// The Interface
public class Fortune : ICardDisplay
{
public string Image { get; set; }
public CardType CardType { get; set; }
public string Name { get; set; }
}
在类中实现接口:
public class Creature : ICardDisplay { /* ... */ }
和
public class Fortune : ICardDisplay { /* ... */ }
现在你可以这样做一个查询:
var result = (
from c in db.Creatures.Cast<ICardDisplay>().Union(db.Fortune)
orderby c.Name
select new CardDisplay()
{
ImgPath = c.Image,
CardType = c.CardType.Name,
Name = c.Name
}).ToList();