Linq嵌套选择新建不工作

Linq嵌套选择新建不工作,linq,subsonic,subsonic3,Linq,Subsonic,Subsonic3,我正试图在亚音速下工作,它一直在为我返回空值 在下面的方法中,我尝试将包含另一个域模型(CompanyModel)的域模型(UserModel)混合起来。但是,对于下面的代码,UserModel.Company始终为空 我错过了什么。任何帮助都将不胜感激 public IList<UserModel> GetUsers() { return (from u in SubsonicSqlServer.Users.All() se

我正试图在亚音速下工作,它一直在为我返回空值

在下面的方法中,我尝试将包含另一个域模型(CompanyModel)的域模型(UserModel)混合起来。但是,对于下面的代码,UserModel.Company始终为空

我错过了什么。任何帮助都将不胜感激

public IList<UserModel> GetUsers()
{             
    return (from u in SubsonicSqlServer.Users.All()
            select new UserModel
                       {
                           UserId= u.UserId,
                           Company = (from c in u.Companies
                                    select new CompanyModel
                                               {
                                                   CompanyId = c.CompanyId,
                                                   CompanyName = c.CompanyName
                                               }).SingleOrDefault(),
                           FirstName = u.FirstName,
                           LastName = u.LastName,
                           BirthDate = u.BirthDate
                       }).ToList();

}
public IList GetUsers()
{             
返回(从SQLServer.Users.All()中的u返回)
选择新的用户模型
{
UserId=u.UserId,
公司=(来自美国公司的c)
选择新公司模式
{
CompanyId=c.CompanyId,
CompanyName=c.CompanyName
}).SingleOrDefault(),
FirstName=u.FirstName,
LastName=u.LastName,
出生日期=美国出生日期
}).ToList();
}
更新(08/11/09):

更多地玩弄代码,我发现在下面的示例中设置CompanyId也不起作用。我最初认为这是亚音速的问题,但如果下面的代码不起作用,我猜这与我的Linq语句有关。有什么想法吗

public IList<UserModel> GetUsers()
{             
    return (from u in SubsonicSqlServer.Users.All()
            select new UserModel
                       {
                           UserId= u.UserId,                            
                           CompanyId = Guid.NewGuid(),
                           FirstName = u.FirstName,
                           LastName = u.LastName,
                           BirthDate = u.BirthDate
                       }).ToList();

}
public IList GetUsers()
{             
返回(从SQLServer.Users.All()中的u返回)
选择新的用户模型
{
UserId=u.UserId,
CompanyId=Guid.NewGuid(),
FirstName=u.FirstName,
LastName=u.LastName,
出生日期=美国出生日期
}).ToList();
}
更新(11/17/2009):

仍然没有找到解决办法。但我们正在转向nHibernate(不是因为这个问题)。

  • 当您的方法的签名行显示
    IList
    是否继承
    UserModel
    时,您正在返回一个
    列表

  • 我是否遗漏了什么,
    e
    从何而来

  • FirstName=e.FirstName, LastName=e.LastName, BirthDate=e.BirthDate块引号

    “UserModel.Company始终为空。”

    由于使用以
    .SingleOrDefault()
    结尾的表达式进行设置,因此我建议查询不会返回单个项。从那里开始调查。如果您在
    u.companys
    中只需要一个项目,请更改为
    .Single()
    ,并强制提前失败

    我认为,在创建新的
    CompanyModel
    对象之前,可以执行
    .Single()

    至于风格,我喜欢查询理解语法(“
    from x in y select
    ”),但当与传统的点符号语法结合使用时,会觉得很尴尬。这很难读。()

    考虑在查询理解中使用
    let
    ,使其更清晰

    另外,由于查询已经返回一个
    IEnumerable
    ,并且调用
    ToList()
    会强制实现所有项,因此如果可能,我会修改我的方法以返回
    IEnumerable

    因此,在您的情况下,我将重构第一个:

    public IEnumerable<User> GetUsers()
    { 
        return from u in SubsonicSqlServer.Users.All()
            let c = u.Companies.Single()
            select new UserModel
            {
                UserId = u.UserId,
                Company = new CompanyModel
                {
                    CompanyId = c.CompanyId,
                    CompanyName = c.CompanyName
                },
                FirstName = e.FirstName,
                LastName = e.LastName,
                BirthDate = e.BirthDate
            };
    }
    
    甚至

    return SubsonicSqlServer.Users.All().Select(u => new UserModel (u));
    

    请查看my fork@github()以了解此解决方案,实际上亚音速尝试投影新类型类时会出现问题,因此您的代码实际上没有问题:D

    根据此线程,投影存在问题(选择非亚音速类型):这可能与此有关。您使用的是哪个亚音速版本?@Funky812:subsonic version 3.0.0.3我遇到了同样的问题,尝试了Funky81的fork,但仍然出现了投影问题。你对使用fork中的代码进行设置有什么建议吗?再玩弄一下,最终将所有内容、嵌套模型数据和所有内容返回到一个匿名对象中,然后将其复制到真实对象。wawa,关于1)我的错误,返回签名应该是IList。我会再次更新原始问题2)中的代码,我的错误e应该是u。我所做的是复制了实际的源代码,并将其转换成我可以共享的东西。但它似乎做得不够仔细。谢谢你抓住它。杰伊,我实现了你的建议,现在我得到了一个亚音速错误:“引用未定义的列”。我将继续排除故障。
    return SubsonicSqlServer.Users.All().Select(u => new UserModel (u));