将 LINQ 返回类型转换为 C# 类

本文关键字:类型转换 LINQ 返回 | 更新日期: 2023-09-27 18:33:29

我有一个针对我的DBModel类的LINQ查询,该查询返回匿名类型。我必须将其转换为已知的 C# 类类型。

我可以直接在 DBModel 类中使用已知类型,但不允许在我的项目体系结构中使用任何已知类型。

例:

static dynamic getEmployees()
{
    SampleDB db = new SampleDB();
    var result = (from x in db.Employes
    select new
    {
        name = x.FirstName + " " + x.LastName,
        department = x.DepartmentId
    });
    return result;
}

我的已知类型:

public class Emp
{
    public string name { set; get; }
    public int department { set; get; }
}

程序:

dynamic d = getEmployees();
List<Emp> result = d.cast<Emp>();
//Other code....

如何将动态类型强制转换为列表?在getEmployees我不能像

static List<Emp> getEmployees()
{
    SampleDB db = new SampleDB();
    var result = (from x in db.Employes
    select new Emp
    {
        name = x.FirstName + " " + x.LastName,
        department = x.DepartmentId
    }).ToList();
    return result;
}

谁能告诉我如何将 LINQ 返回类型强制转换为已知类型?

将 LINQ 返回类型转换为 C# 类

Cast<>是一种扩展方法,动态对象不直接支持这些方法。

你可以通过像这样调用扩展方法来解决这个问题:Enumerable.Cast<Emp>(d),但这仍然不起作用,没有从匿名类型到 Emp 的已知转换。

你可以尝试类似的东西 .Select() ,这应该有效。然而,最简单的方法是一个简单的 for 循环

dynamic d = getEmployees();
var emps = new List<Emp>();
foreach (var emp in d)
{
    emps.Add(new Emp(){name = emp.name, department = emp.department};
}

如果要按需将集合用作 IEnumerable,而不是将其放在列表中,则可以将其包装在帮助程序方法中:

IEnumerable<Emp> getEmps(dynamic d)
{
    foreach (var emp in d)
    {
        yield return new Emp(){name = emp.name, department = emp.department};
    }
}

dynamic类型上没有cast方法。你应该做的是将动态显式转换为所需的类型,因为在动态方法中你有一个匿名对象,你必须执行一个中间步骤。像这样:

var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
var json = serializer.Serialize(d);
List<Emp> result = serializer.Deserialize<List<Emp>>(json);