C# 我可以改进这个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,

我编写了以下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);
}
以下是表格:

我是否可以改进我的查询,使其成为一个查询,而不是两个查询。正如你们在表图表中看到的,我有更多的实体来提取所需的数据(总共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基元或枚举类型:(