如何使用lambda表达式将IQueryable <anonymous type>转换/转换为IQueryable <strong typed =“”object =“”> </strong> </anonymoustype>

时间:2014-12-14 10:07:52

标签: c# linq casting lambda iqueryable

以下是我想要达成的目标:

 int id = 1;
        var db = new Project.Models.Context();
        var query1 = db.Users.Where(t => t.id == id);
        //here is where the problem starts
        IQueryable<Project.Models.test> test = query1.Join(db.Table2,
                    users => users.id,
                    table2 => table2.userId,
                    (users, table2) => new
                    {
                        users.UserName,
                        table2.SomeValue
                    });

到目前为止我已尝试过:

-cast query1 to

(IQueryable<Project.Models.test>)query1

- 在关键字new上添加storgly类型名称:

 (users, table2) => new IQueryable<Project.Models.test>) ...

 (users, table2) => new Project.Models.test ...

-naming colums     (users,table2)=&gt;新     {          ColumnName1 = users.UserName,          ColumnName2 = table2.SomeValue      });

- 上述组合

我也理解有一种方法可以使用普通的sql表达式来解决这个问题:

 select new Project.Models.test 
        {
            ColumnName1 = users.UserName,
            ColumnName2 = table2.SomeValue
        }    

但我想用lambda表达式写这个,如果可能的话。

我是第一次发表海报和长期读者,希望所有内容都写得正确而清晰。

ps:我也冒昧地简化变量名和连接查询。

编辑:

为了完成: 将查询保存在匿名变量joinedTable中,然后使“插入”语句有效。

IQueryable<Project.Models.test> tst = from a in joinedTable
                                      select new Project.Models.test
                                      {
                                          UserName = a.UserName,
                                          SomeValue = a.SomeValue
                                      };

因此,如果可以使用lambda表达式编写上述语句,那么子命令就是。

3 个答案:

答案 0 :(得分:0)

这是你的意思吗?

    IQueryable<Project.Models.test> query =
        from u in db.Users
        join t in db.Table2 on u.id equals t.userId
        where u.id == id
        select new Project.Models.test  
                {
                    UserName = u.UserName,
                    SomeValue = t.SomeValue
                };

答案 1 :(得分:0)

我认为这是不可能的。你可以做到

result.AsEnumerable().Select(anonymous => new Typed { Property = anonymous.Property));

但那非常难看。我还尝试使用dotPeek查看生成的代码。

答案 2 :(得分:0)

anwser是:

int id = 1;
    var db = new Project.Models.Context();
    var query1 = db.Users.Where(t => t.id == id);
    //here is where the problem starts
    IQueryable<Project.Models.test> test = query1.Join(db.Table2,
                users => users.id,
                table2 => table2.userId,
                (users, table2) => new Project.Models.test()
                {
                    columName1 = users.UserName,
                    columName2 = table2.SomeValue
                });

ColumnNames必须与新Project.Models.test()中的属性相对应。

Props去HugoRune让我重新检查我的代码。我还想指出,Jaap Elgersma anwser也解决了这个问题,但不是用lambda表示法。