C# 我可以改进这个linq查询吗?
我编写了以下linq查询:C# 我可以改进这个linq查询吗?,c#,asp.net-mvc,linq,entity-framework,C#,Asp.net Mvc,Linq,Entity Framework,我编写了以下linq查询: using (var db = new CardContext()) { var result = (from c in db.Creatures orderby c.Name select new CardDisplay() { ImgPath = c.Image,
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);
}
以下是表格:
我是否可以改进我的查询,使其成为一个查询,而不是两个查询。正如你们在表图表中看到的,我有更多的实体来提取所需的数据(总共5个,其余未显示),所以会有更多的查询。或者我做得对吗?还有一个问题,一般来说,编写一个复杂的linq查询还是编写几个简单的linq查询更好
联盟的解决方案非常好,谢谢大家。但我希望Jonny Piazzi的界面解决方案能起作用,也许我做错了什么。你应该能够使用一个联合体:
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()
使用这个查询,只会向数据库发出一个请求,而不是两个请求
ref:您不需要将第一个结果转换为列表。 使用联合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);
如果先使用代码,则可以使用界面,如下所示:
// The Interface
public class Fortune : ICardDisplay
{
public string Image { get; set; }
public CardType CardType { get; set; }
public string Name { get; set; }
}
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();
在类中实现接口:
public class Creature : ICardDisplay { /* ... */ }
及
现在,您可以执行如下查询:
// The Interface
public class Fortune : ICardDisplay
{
public string Image { get; set; }
public CardType CardType { get; set; }
public string Name { get; set; }
}
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();
var结果=(
从db.biods.Cast()Union(db.Fortune)中的c开始
orderby c.Name
选择新卡显示()
{
ImgPath=c.图像,
CardType=c.CardType.Name,
Name=c.Name
}).ToList();
您是否使用了“代码优先”和/或“POCO”?代码优先[所需的文章长度]以便使用界面。结果列表是否可能包含重复条目?您需要/关心他们吗?结果中没有重复项。接口,听起来很有趣,有关于此的文章吗?请注意,由于延迟执行,这也将是对db的单个请求。它说:LINQ to Entities仅支持强制转换EDM基元或枚举类型:(