这是我在实体7中想要实现的目标。
假设我有两个表:Product
和ProductType
。产品有ProductTypeId
- FK到ProductType
。我需要从ProductType
中选择整个产品对象和一个属性,并将它们组合在这个类中:
public class MyData
{
public string StringProperty {get; set;}
public Product ClassProperty {get; set;}
}
现在出现了疑问:
var productId = 1; //example
database.Products
.Include( t => t.FK_ProductType)
.Where(p => p.ProductId == productId)
.Select(result =>
new MyData
{
StringProperty = result.FK_ProductType.ProductTypeDescription, //this works
ClassProperty = result //this doesn't
}
);
我得到的错误是:无法将“System.Linq.Expressions.FieldExpression”类型的对象强制转换为“System.Linq.Expressions.ParameterExpression”。
PS:在仔细观察之后,我认为首先走这条路可能不是一个好主意。即使它有效MyData.ClassProperty
也会附加所有ProductType
表,而这不是我需要的。我只需要Product
类和ProductType
类中的一个属性。尝试通过使用一些包装类来最小化流量,但也尝试最小化所需的代码。
但我仍然想知道为什么这种方法不起作用。 谢谢!
UPD :在评论中为每个请求添加实体模型模型。
public class Product
{
public int ProductId {get; set;}
public string ProductName {get; set;}
public int FK_ProductTypeId {get; set;} //this is our link to ProductType
public virtual ProductType FK_ProductType {get; set;} //joined ProductType
}
public class ProductType
{
public int ProductTypeId {get; set;} //our FK
public string ProductTypeDesr {get; set;}
//And Entity creates this
public virtual ICollection<Product> {get; set;} = new HashSet<Product>();
}
UPD2 :感谢评论中的Evk,删除.Include语句使一切正常。 知道原因仍然很有意思。
答案 0 :(得分:1)
可能是EF7的bug?看看这个discussion 。您也可以尝试这个解决方案:
var query = (from product in database.Products
where product.ProductId == productId
join type in database.ProductTypes
on product.FK_ProductTypeId equals type.ProductTypeId
select new {
ClassProperty = product,
StringProperty = type.ProductTypeDescription
}).FirstOrDefault();