我尝试使用Entity Framework 6(EF)在Visual Studio 2015上使用WPF中的LINQ获取结果。对于员工的测试,结果需要显示在一个ListView
中。我有两个EF实体:DrugTests
和AlcoholTests
。在我的项目中,我有一些视图模型可以将这些模型映射到:DrugTestViewModel
和AlcoholTestViewModel
,两者都来自接口ITestViewModel
。
这两个VM共享许多属性,同时也有自己独特的属性(因此需要两个实体)。我使用LINQ返回Task<ObservableCollection<ITestViewModel>>
,首先从DrugTests
实体获取:
var query = (from dt in context.DrugTests
.Where(x => x.employeeID.Equals(employeeId))
select new DrugTestViewModel
{
EmployeeId = dt.employeeID,
TestType = "Drug",
OrderedDate = dt.orderedDate,
// set other properties
}
).ToList();
然后我尝试使用以下内容添加到查询中:
query.AddRange(from at in context.AlcoholTests
.Where(x => x.employeeID.Equals(employeeId))
select new AlcoholTestViewModel
{
EmployeeId = at.employeeID,
TestType = "Alcohol",
// set other properties...
}
);
它在AddRange()
上提供了以下例外:
参数1:无法转换
'System.Linq.IQueryable<MySolution.ViewModel.AlcoholTestViewModel>'
来'System.Collections.Generic.IEnumerable<MySolution.ViewModel.DrugTestViewModel>'
我做错了什么?
答案 0 :(得分:2)
有点晚了,但我想分享另一个解决方案。我会这样使用Concat:
var query=...
var query2=..
var result= query.AsEnumerable<ITestViewModel>().Concat(query2);
这样您就可以在不需要实现结果的情况下维护延迟执行。
答案 1 :(得分:1)
问题是query
变量类型为List<DrugTestViewModel>
,而您需要它为List<ITestViewModel>
类型。由于IQueryable<T>
是协变的,因此您可以通过在调用此ToList
时明确指定所需类型来实现这一目标
var query = (...).ToList<ITestViewModel>();
答案 2 :(得分:0)
from at in context ...是一个查询,因此是IQuerable错误 添加.ToList()调用ad,你的linq查询的结尾返回一个支持IEnumerable的列表。
您的第一个代码段包含.ToList(),您的第二个缺失。