C# C实体框架CS1941
我正在尝试将linq与实体框架结合使用。在下面的代码中,第一个连接是红色的波形,我有这个错误 严重性代码说明项目文件行抑制状态 错误CS1941 join子句中一个表达式的类型为 不准确的调用“Join”时类型推断失败 代码 编辑: 在注释并意识到我的错误代码之后,我决定添加我的实体类。 当我运行我的项目时,实体框架在Sql Server上创建Id和root_Id列,然后我考虑可以使用Resultset.root等于Words.Id结构C# C实体框架CS1941,c#,entity-framework,linq,C#,Entity Framework,Linq,我正在尝试将linq与实体框架结合使用。在下面的代码中,第一个连接是红色的波形,我有这个错误 严重性代码说明项目文件行抑制状态 错误CS1941 join子句中一个表达式的类型为 不准确的调用“Join”时类型推断失败 代码 编辑: 在注释并意识到我的错误代码之后,我决定添加我的实体类。 当我运行我的项目时,实体框架在Sql Server上创建Id和root_Id列,然后我考虑可以使用Resultset.root等于Words.Id结构 public class Word{ [Key]
public class Word{
[Key]
public int Id { get; set; }
...}
public class Result{
[Key]
public int Id { get; set; }
public virtual Word root { get; set; }
...}
public class Result{
[Key]
public int Id { get; set; }
public virtual Result result { get; set; }
...}
和上下文类
public class DatabaseContext : DbContext{
...
public DbSet<Word> Words { get; set; }
public DbSet<Result> Results { get; set; }
public DbSet<Sens> Senses { get; set; }
...
}
Id和root类型不兼容,但当我使用兼容的类型更改查询时,问题仍在继续。我会出什么问题。谢谢问候语有不同的类型。检查一下。
也许它们是int和long或者其他什么
从@OzanTopal:
有关更多信息,请查看此链接:您正在加入3个表,但结果只是: 选择o 你参加的目的是什么 检查上面的答案,如果是不同类型的,也检查此答案:
on o.Id equals r.root
on r.Id equals s.Id
r.val== SomeVal
此错误是因为检测和结果类型的Id属性不兼容。它们不必是一样的。例如,从编译器的角度来看,一个是int,另一个是long是可以的。但是,例如,字符串和int或Guid或int是不兼容的。解决方案是使这两种类型即使不相同也兼容。我理解您可能无法这样做,因为您的实体模型可能是从现有数据库构建的,并且您可能没有权限或不想更改列的基本类型 如果要解决代码本身的编译问题,则必须执行显式类型转换:
var vals = (from o in db.Words
join r in db.Results
on o.Id equals r.root
join s in db.Senses on r.Id equals Convert.ToString(s.Id)
where r.val== SomeVal
select o ).Take(10);
这假设Result类的Id属性是string,而Sense类的Id是一些数字类型。我们不知道Words、Results等返回的类型是什么。有关更多信息,请查看@Tekin Güllü
var vals = (from o in db.Words
join r in db.Results
on o.Id equals r.root
join s in db.Senses on r.Id equals Convert.ToString(s.Id)
where r.val== SomeVal
select o ).Take(10);