使用从LINQ到SQL的匿名类型

时间:2015-03-25 21:31:17

标签: c# linq linq-to-sql anonymous

我正在制作一个项目,我在项目中收到Anonymous Type的错误。问题是如何从其他类如函数中获取和使用匿名类型。

public IList GetReferenceList()
{
    var result = from r in entity.Reference
                 join d in entity.Reference_Detail on r.id equals d.refid
                 select new { ID = d.id, REFNAME = r.Name, DETAIL=d.Name };
    return result.ToList();
}

问题在这里。我该怎么写这个函数的返回类型,我想在foreach中使用。

private void Form1_Load(object sender, EventArgs e)
{
     var data = GetReferenceList();
     foreach(var item in data)
     {
         //I didn't use field in here.
     }
}

我不想创建这样的类,并使用该类。

public class MyList()
{
   public int ID { get; set; }
   public string REFNAME { get; set; }
   public string DETAIL { get; set; }
}

public List<MyList> GetReferenceList()
{
    var result = from r in entity.Reference
                 join d in entity.Reference_Detail on r.id equals d.refid
                 select new MyList { ID = d.id, REFNAME = r.Name, DETAIL=d.Name };
    return result.ToList();
}

private void Form1_Load(object sender, EventArgs e)
{
     List<MyList> data = GetReferenceList();
     foreach(MyList item in data)
     {
         //I can use field in here.
     }
}

我有100个这样的查询。如果我这样做,将是100级查询。

请帮助我。

1 个答案:

答案 0 :(得分:1)

我不是说你应该这样做,相反,但你可以使用动态来返回匿名类型并在以后解决它们的属性:

public IEnumerable<dynamic> GetReferenceList()
{
    return from r in entity.Reference
           join d in entity.Reference_Detail on r.id equals d.refid
           select new { ID = d.id, REFNAME = r.Name, DETAIL = d.Name };
}

在消费代码中:

 var data = GetReferenceList();
 foreach (var item in data)
 {
     var name = (string)(item.REFNAME);
     ...
 }

你很快就会开始讨厌这种方法。您将继续将动态类型转换为运行时类型,您将没有智能感知(在这种情况下在item.上),您将不会进行编译时检查,因此它容易出错且易受各种影响微妙的错误。帮自己一个忙,并使用命名类型。