我正在开发一个MVC应用程序。
我使用两个查询来获取记录,我想从这些查询中获取常见记录。
我想返回列表中的数据集
喜欢这个
return Json(poList, JsonRequestBehavior.AllowGet);
我的两个问题是......
var poList = (from po in db.PurchaseOrders
where po.CompanyId == companyId && po.PartyId == partyId && (po.IsDeleted == false || po.IsDeleted == null)
select po into newPO
select new
{
Name = newPO.PONo,
Id = newPO.Id
});
//.ToList().OrderBy(e => e.Name);
var poList2 = (db.Employees.Where(x => x.Id == EmpID)
.SelectMany(x => x.Roles)
.SelectMany(x => x.Employees)
.Distinct()
.SelectMany(x => x.PurchaseOrders)
.Select(po => new { Name = po.PONo, Id = po.Id }));
var finalPO = from PO in poList.ToList().Union(poList2).ToList() select PO);
答案 0 :(得分:3)
你无法联合它们的原因是两个列表返回不同的对象。
第一个列表返回包含成员Name
和Id
的匿名类型。相反,如果您只想在第一个查询中退回采购订单,那么您只需使用以下内容:
var poList = (
from po in db.PurchaseOrders
where po.CompanyId == companyId &&
po.PartyId == partyId &&
(po.IsDeleted == false || po.IsDeleted == null)
select po
);
您可能需要在上面的查询中附加.ToList()
才能使用Union(...)
方法。然后,您应该能够将两个序列结合在一起(假设poList2
也是db.PurhaseOrders
个对象的序列。
相反,您可以将poList
后面的查询更改为以下内容,而不是更改上面poList2
的查询,以达到相同的效果,但结果不同:
var poList2 = (db.Employees.Where(x => x.Id == EmpID)
.SelectMany(x => x.Roles)
.SelectMany(x => x.Employees)
.Distinct()
.SelectMany(x => x.PurchaseOrders)
.Select(po => new { Name = po.PONo, Id = po.Id }));
就我个人而言,我认为第一个更清楚(除非PO对象上有很多字段,你只需要显示两个字段)。
更新:我看到原始帖子已经过编辑,因此两个查询现在都返回相同的对象(或对象的形状)。但是,海报仍在尝试错误地合并结果。海报正在使用另一个LINQ查询,试图使用Union(...)
方法。这完全没必要。不妨为他/她写出代码:
var finalPO = poList.Union(poList2).ToList(); // ToList() only necessary if you need a list back
应该这样做。
真的,我在下面的评论中提到的两本书将帮助你理解.NET和LINQ:APress - Pro C#和.NET Framework 4.0; O'Reilly - C#5 in a Nutshell。还有很多关于LINQ的书籍 - 但是如果没有扎实的.NET(以及C#,F#或VB),你就无法理解或使用LINQ。
答案 1 :(得分:1)
我不认为你需要中间结果中的ToList(),只需使用union并在最终结果中执行ToList,如:
var finalPO = poList.Union(poList2).ToList()
答案 2 :(得分:0)
首先,创建一个像这样的ViewModel:
public class PurchaseOrderViewModel
{
public int Id { get; set; }
public string Name { get; set; }
}
然后,在你的代码中使用它:
var poList1 = (from po in db.PurchaseOrders
where po.CompanyId == companyId && po.PartyId == partyId
&& (po.IsDeleted == false || po.IsDeleted == null)
select po into newPO
select new PurchaseOrderViewModel
{
Name = newPO.PONo,
Id = newPO.Id
}).ToList();
var poList2 = (db.Employees.Where(x => x.Id == EmpID)
.SelectMany(x => x.Roles)
.SelectMany(x => x.Employees)
.Distinct()
.SelectMany(x => x.PurchaseOrders)
.Select(po => new PurchaseOrderViewModel
{
Name = po.PONo,
Id = po.Id
})).ToList();
var finalList = poList1.Union(poList2);