C # Entity Framework CS1941 - PullRequest
       4

C # Entity Framework CS1941

0 голосов
/ 18 января 2019

Я пытаюсь использовать linq с Entity Framework. В приведенном ниже коде первое соединение - это красная заглушка, и у меня есть эта ошибка.

Код серьезности Описание Состояние подавления строки файла проекта Ошибка CS1941 Тип одного из выражений в предложении соединения: неверен. Ошибка вывода типа при вызове «Join»

Код

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 s.results_id

            select  o ).Take(10) ;

EDIT:

После комментариев и осознания моего ошибочного кода я решил добавить свой класс сущностей. Когда я запускаю свой проект, тогда структура сущностей создает столбцы Id и root_Id на Sql Server, тогда я решил, что могу использовать Resultset.root равен Words.Id структура

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; }
 ...
}

Идентификатор и root не совместимы, но когда я меняю запрос на совместимые, проблема продолжается. Что я делаю не так? Благодарю. Привет

Ответы [ 3 ]

0 голосов
/ 18 января 2019

Вы объединяете 3 таблицы, но результат просто:

select o * * 1004

Какова цель вашего объединения?

Проверьте ответ выше или проверьте также, если это разные типы:

on o.Id equals r.root
on r.Id equals s.Id 
r.val== SomeVal
0 голосов
/ 18 января 2019

Эта ошибка вызвана тем, что свойства Id типов Sense и Result несовместимы. Они не должны быть одинаковыми. Например, хорошо (с точки зрения компилятора), чтобы один был int, а другой - long. Однако, например, string и 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);

Предполагается, что свойство Id класса Result является строкой, а Id класса Sense - числовым типом.

0 голосов
/ 18 января 2019

r.Id и s.Id имеют разные типы. Проверь их. Может быть, они int и long или что-то еще.

От @OzanTopal:

Для получения дополнительной информации перейдите по этой ссылке: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-messages/cs1941

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...