C# 具有linq的实体框架多表
对于代码优先模型:C# 具有linq的实体框架多表,c#,entity-framework,linq,code-first,C#,Entity Framework,Linq,Code First,对于代码优先模型: public class User { [Key] public long Id { get; set; } public virtual List<Address> Addresses { get; set; } public string UserName { get; set; } } public class Address { [Key] public long Id { get; set; }
public class User
{
[Key]
public long Id { get; set; }
public virtual List<Address> Addresses { get; set; }
public string UserName { get; set; }
}
public class Address
{
[Key]
public long Id { get; set; }
public string Reference { get; set; }
public string Street { get; set; }
}
它不返回地址表,只返回用户名。默认情况下,EF启用延迟加载,因此您需要通过调用Include使用即时加载,此方法还可以获取相关实体,在您的示例中,IncludeAddresses方法获取相关地址 即时加载是一个过程,在此过程中,对一种类型实体的查询也会作为查询的一部分加载相关实体。通过使用Include方法实现即时加载
这里findOP正在使用投影查询,因此,不需要立即加载或任何加载。@IvanStoev如果延迟加载,则在u=>u.addresses上出现错误:无法将lambda表达式转换为“string”类型,因为它不是委托类型。@Alex这无关紧要。@Sara Khan使用System.Data.Entity添加。您确定数据库表包含相关地址吗?您是否检查了生成的表-地址表中必须有User\U Id列。是的,User\U Id在那里。问题通过使用IncludeAddressEst解决。使用Include无法修复已发布的查询。如果它是固定的,那么查询就不同了,这篇文章是误导性的。@IvanStoev你可以在这里提出解决方案。我也会试试。这不是谁来提供解决方案的问题。我假设,一旦你问你有问题,我想说的是,如果数据是正确的,EF模型是正确的,那么问题不可能是你描述它的方式。如果您返回的是用户对象列表,那么Include会有所帮助,而对于像您这样的查询,它会被忽略,因此无法修复。
public IEnumerable GetLicensee()
{
using (var db = new DataModelContext())
{
IEnumerable query = (from b in db.User
select new { UserName= b.UserName,Address=b.Addresses }).ToList();
return query;
}
}
public IEnumerable GetLicensee()
{
using (var db = new DataModelContext())
{
IEnumerable query = (from b in db.User.Include("Addresses")
select new { UserName= b.UserName,Address=b.Addresses }).ToList();
return query;
}
}