2017-07-31 78 views
0

我如何结合这两个?如何结合LINQ和Lambda?

var viewModel2 = tu.SingleOrDefault(su => su.email == logindetails.Email); 




//Get jobs and personal details 
var viewModel = from u in db.badusers 
          join r in db.Users on u.email equals r.Email 
          join j in db.roles on u.id equals j.roleid 
          where r.UserName.Equals(usernameCookie) 
          select new JoinedModel { roles = u, jobs = j, users = r}; 

我的选择应该在哪里?

备注: JoinedModel包含多个模型。如果我尝试返回viewModel2数据是正确的,但它是一个视图与多个模型,因此为什么我必须使用ViewModel(JoinedModel),所以抛出的错误是标准'我期望JoinedModel(viewModel),但你传递给我viewModel2'。

+3

我们需要更多的细节。什么类型是'tu'?你的预期结果是什么?你已经尝试了什么? – GalacticCowboy

+0

我已添加更多详细信息。 –

+1

仍然不清楚'viewmodel2'应该在哪里使用。你想要返回两个对象吗?返回类型是一个元组,还是'JoinedModel'有一个构造函数接受这两个对象? –

回答

0

您可以创建一个匿名对象,但我强烈建议选择更具描述性的项目名称:

var combinedModel = new { 
    viewModel2 = tu.SingleOrDefault(su => su.email == logindetails.Email), 
    viewModel = from u in db.badusers 
       join r in db.Users on u.email equals r.Email 
       join j in db.roles on u.id equals j.roleid 
       where r.UserName.Equals(usernameCookie) 
       select new JoinedModel { roles = u, jobs = j, users = r} 
}; 

这将创建一个对象combinedModel,具有两个属性:combinedModel.viewModel2combinedModel.viewModel

+0

这可能会工作,如果调整,现在它给我:在System.Core.dll中发生类型'System.InvalidOperationException'的异常,但未在用户代码中处理 附加信息:序列包含多个匹配元素 –

+0

启用我的try catch来查看是否有任何SQL甚至被返回。 –

+1

“Sequence包含多个匹配元素”的错误可能是由'SingleOrDefault()'调用引起的。它发现多个项目在使用'SingleOrDefault()'时是非法的,它基本上意味着“给我存在的单个项目,如果没有找到,则返回null,或者如果超过1个项目,则抛出异常。如果您不关心多个现有项目,并且您只想要其中的任何一个,您可以尝试'FirstOrDefault()'。 –