【问题标题】:How can I use be generic to result of linq query?如何对 linq 查询的结果通用?
【发布时间】:2013-08-07 14:13:35
【问题描述】:

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

我的问题作为标题。我的数据库中有两个表:

  • 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&lt;AnonymousType#1&gt; 隐式转换为 System.Collections.Generic.List&lt;Entity.Siniflar&gt;

如何使用通用结果。我可以为此做些什么?


我改变了问题:

类:

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

方法:

    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 类型时遇到同样的错误...

【问题讨论】:

  • 我相信Siniflar 实体没有Ad 属性。你打算怎么退货?
  • 你需要一个 RSiniflar 上的默认构造函数

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


【解决方案1】:

您可以返回类型化列表,但不能返回匿名类型列表。所以你需要创建一个类来处理你的结果:

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),但你必须确保这个类具有所有必要的属性。

【讨论】:

  • 我改变了问题。现在可以看了吗?
【解决方案2】:

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

例如

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

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

【讨论】:

  • 不客气。请记住对您认为有帮助的任何答案进行投票。 :)
  • 您好,我在问题上更改了方法:请循环...但是,我再次收到错误:无法创建类型为“System.Object”的常量值。此上下文仅支持原始类型或枚举类型。请帮忙..
猜你喜欢
  • 2020-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-05
  • 1970-01-01
相关资源
最近更新 更多