我正在开发一个应用程序的一部分,该应用程序只是从数据库中提取信息并将其显示给用户。为简单起见,让我们假设我有一个包含两个表的数据库,Cats
并且Dogs
. 两个表都手动分配了主键,并且从不重复/重叠。我试图实现的目标是执行 1 个 LINQ 查询,concat
这两个表都可以。
我最近问了这个关于LINQ concat
对两个对象集合执行 a 的问题,Cats
并且Dogs
,它们是在代码中手动创建的。我建议阅读上一个问题,因为它会给这个问题提供很多见解。
我希望使用接口的原因是为了简化我的查询。我目前有一个解决方案,.Select
我需要将每个列转换为匿名类型。这在这种情况下可以正常工作,但会使用包含我正在使用的数据的页面。
上一个问题和这个问题之间的不同之处在于我试图从数据库中提取这些动物。根据我的分析,似乎.NET
或Entity Framework
无法将 mydatabase
与 my联系起来interface
模型(来自旧问题)
public interface iAnimal
{
string name { get; set; }
int age { get; set; }
}
public class Dog :iAnimal
{
public string name { get; set; }
public int age { get; set; }
}
public class Cat:iAnimal
{
public string name { get; set; }
public int age { get; set; }
}
LINQ
这是我尝试过的一些不同的查询以及由此产生的错误。第一个示例将使用上一个问题的解决方案。
var model = _db.Cats.Concat<iAnimal>(_db.Dogs).Take(4);
System.ArgumentException: DbUnionAllExpression requires arguments with compatible collection ResultTypes.
没有协方差:
var model = _db.Cats.Cast<iAnimal>().Concat(_db.Dogs.Cast<iAnimal>());
System.NotSupportedException: Unable to cast the type 'Test.Models.Cat' to type 'Test.Interfaces.iAnimals'. LINQ to Entities only supports casting Entity Data Model primitive types.
从上面的错误来看,我似乎无法使用接口与数据库进行交互,因为它没有映射到任何特定的表。
任何见解将不胜感激。谢谢
编辑
作为对@Reed Copsey 的回应,使用您的解决方案,我得到了与我的示例相同的错误without covariance
。我尝试更改视图的类型以匹配错误推荐的内容,这导致了此错误
System.InvalidOperationException: The model item passed into the dictionary is of type 'System.Data.Entity.Infrastructure.DbQuery`1[Test.Interfaces.iAnimal]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable`1[Test.Models.Cat]'.