我能以某种方式改进这个linq查询吗?

时间:2014-03-11 12:30:04

标签: 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,
                          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);
}

以下是表格:

enter image description here

我可以以某种方式改进我的查询,因此它将在1个查询中,而不是两个。正如你在表格图中看到的,我有更多的实体来提取所需的数据(共5个,其余未显示),因此会有更多的查询。或者可能是我,我做得对吗?还有一个问题,一般来说编写1个复杂的linq查询还是一些简单的问题会更好吗?

与Union的解决方案非常好,谢谢大家。但我希望Jonny Piazzi的界面解决方案能够奏效,也许我做错了。

3 个答案:

答案 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()

使用此单个查询,只会向数据库发出一个请求,而不是两个。

参考:http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b

答案 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();