使用匿名类型从 LINQ 到 SQL

Using Anonymous Type from LINQ to SQL

我正在制作一个项目,但在项目中出现匿名类型错误。问题是如何从其他 class 函数中获取和使用匿名类型。

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();
}

问题就在这里。这个函数应该写什么return类型,我想在foreach中使用。

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

我不想做那样的 class,使用 class。

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 class 用于查询。

请帮帮我。

相反,我不是说你应该这样做,但是你可以使用动态return匿名类型并稍后处理它们的属性:

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. 上),你不会有编译时检查,所以它容易出错并且容易受到各种影响细微的错误。帮自己一个忙,使用命名类型。