如何对linq查询的结果使用泛型?

时间:2013-08-07 14:13:36

标签: linq entity-framework generics linq-to-entities entity

首先,我的英语不是很好。所以我很抱歉。 :)

我的问题是标题。我的数据库上有两个表:

  • Siniflar(SinifId,SinifAdi,Kapasite,OgretmenId)
  • Ogretmenler(OgretmenId,Ad,Soyad,Brans)

查询:

  var siniflar = (from s in db.Siniflar 
                  join o in db.Ogretmenler 
                  on s.OgretmenId equals o.OgretmenId 
                  select new { s.SinifId, s.SinifAdi, s.Kapasite, o.Ad }).ToList();

我想将查询结果用作通用,如下所示:

  public List<Siniflar> SiniflariListele() 
  { 
   var siniflar = (from s in db.Siniflar 
                  join o in db.Ogretmenler 
                  on s.OgretmenId equals o.OgretmenId 
                  select new { s.SinifId, s.SinifAdi, s.Kapasite, o.Ad }).ToList();
   return siniflar; 
  } 

但是我收到了一个错误。因为结果是匿名类型。

错误:无法将System.Collections.Generic.List<AnonymousType#1>类型隐式转换为System.Collections.Generic.List<Entity.Siniflar>

我如何使用通用结果?我能做些什么呢?


我改变了问题:

类别:

public class RSiniflar
{
    public int SinifId { get; set; }
    public string SinifAdi { get; set; }
    public int Kapasite { get; set; }
    public string OgretmenAdiSoyadi { get; set; }
}

Metod:

    public List<RSiniflar> SiniflariListele()
    {
        List<RSiniflar> siniflar = (from s in db.Siniflar
                        join o in db.Ogretmenler
                        on s.OgretmenId equals o.OgretmenId
                        select new RSiniflar
                        {
                            SinifId = s.SinifId,
                            SinifAdi = s.SinifAdi,
                            Kapasite = s.Kapasite,
                            OgretmenAdiSoyadi = o.Ad + ' ' + o.Soyad
                        }).ToList();
        return siniflar;
    }

但现在查询错误:无法创建“System.Object”类型的常量值。在此上下文中仅支持原始类型或枚举类型。

我认为,我的查询存在问题...查询var type时出现错误...

2 个答案:

答案 0 :(得分:0)

您可以返回键入的列表,但不能返回匿名类型列表。因此,您需要创建一个可以处理结果的类:

public class A
{
    public int SinifId { get; set; }
    public int SiniAdi { get; set; }
    public int Kapasite { get; set; }
    public int Ad { get; set; }
}

然后在查询中使用它,而不是匿名对象:

public List<A> SiniflariListele() 
{ 
    var siniflar = (from s in db.Siniflar 
                    join o in db.Ogretmenler 
                    on s.OgretmenId equals o.OgretmenId 
                    select new A {
                        SinifId = s.SinifId,
                        SinifAdi = s.SinifAdi,
                        Kapasite = s.Kapasite,
                        Ad = o.Ad
                    }).ToList();
    return siniflar; 
} 

您可以对现有的类(例如Siniflar)执行相同的操作,但您必须确保此类具有所有必需的属性。

答案 1 :(得分:0)

而不是使用new { property1, property2 },而是在Siniflar中创建新的select

E.g。

  select new Siniflar() { 
    SinifId = s.SinifId, 
    SinifAdi = s.SinifAdi, 
    Kapasite = s.Kapasite }).ToList()

注意:正如lazyberezovsky所提到的,您的映射似乎存在缺陷,因为Siniflar不包含属性Ad