Linq AddRange()用于从接口

时间:2016-04-15 18:54:52

标签: c# .net wpf entity-framework linq

我尝试使用Entity Framework 6(EF)在Visual Studio 2015上使用WPF中的LINQ获取结果。对于员工的测试,结果需要显示在一个ListView中。我有两个EF实体:DrugTestsAlcoholTests。在我的项目中,我有一些视图模型可以将这些模型映射到:DrugTestViewModelAlcoholTestViewModel,两者都来自接口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>'

我做错了什么?

3 个答案:

答案 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(),您的第二个缺失。