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