Простой запрос Linq возвращает неожиданные результаты - PullRequest
0 голосов
/ 07 июня 2018

Я настроил соединение с БД следующим образом:

Web.config

<add name="MyContext" providerName="System.Data.SqlClient" connectionString="Data Source=MyServer;Initial Catalog=MyDB;User id=MyId;Password=MyPassword; MultipleActiveResultSets=true" />

Затем у меня есть свой класс для создания контекста, чтобы получить доступ к базе данных

    public class MyContext: DbContext
    {
        public MyContext() : base("MyContext")
        {
            Database.SetInitializer<Models.MyContext>(null);
        }

        public DbSet<MyModel> MyTable { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        }
    }
}

Тогда у меня есть моя БД с таблицей «MyTable», которая является таблицей истории, поэтому каждый день в 6:00 я вставляю данные из другой таблицы, наконец, у меня будут результаты, подобные этому

Id | Date
-----------------------------
 1 | 2018-05-30 16:01:00.332
 1 | 2018-05-31 14:21:03.456
 1 | 2018-06-01 11:45:01.316
 2 | 2018-05-30 21:44:00.544
 2 | 2018-05-31 22:45:00.987
 2 | 2018-06-01 23:46:00.769

Итак, теперь в MyController.cs

    public IQueryable<MyModel> GetData(string Id)
    {
        var result = MyContext.MyTable.AsQueryable();

        return result.Where(w => w.Id == Id).toList();
    }

Я пытаюсь вернуть все строки для Id = 1, при отладке, когда я устанавливаю точку останова в операторе возврата, он возвращает одну и ту же строку для каждой записи.

    Id | Date
    -----------------------------
     1 | 2018-05-30 16:01:00.332
     1 | 2018-05-30 16:01:00.332
     1 | 2018-05-30 16:01:00.332

Редактировать: я добавляю класс MyModel по вашему запросу

 public class MyModel
    {
        [Index(IsUnique = false)]
        public int Id { get; set; }
        public DateTime Date{ get; set; }

        public string Field1 { get; set; }
        public string Field2 { get; set; }
        public string Field3 { get; set; }
        public string Field4 { get; set; }
        public string Field5 { get; set; }
        public string Field6 { get; set; }
        public string Field7 { get; set; }
        public DateTime? Field8 { get; set; }
        public string Field9 { get; set; }
        public string Field10 { get; set; }
        public string Field11 { get; set; }
        public string Field12 { get; set; }
        public string Field13 { get; set; }
        public string Field14 { get; set; }
        public string Field15 { get; set; }
        public string Field16 { get; set; }
        public string Field17 { get; set; }
        public string Field18 { get; set; }
        public string Field19 { get; set; }
        public int? Field20 { get; set; }
        public string Field21 { get; set; }
        public int? Field22  { get; set; }
        public int? Field23 { get; set; }
        public int? Field24  { get; set; }
        public string Field25 { get; set; }
        public string Field26 { get; set; }
        public string Field27 { get; set; }
        public int Field28 { get; set; }
        public string Field29 { get; set; }
        public string Field30 { get; set; }
        public string Field31 { get; set; }
        public string Field32 { get; set; }
        public string Field33 { get; set; }
        public DateTime? Field34 { get; set; }

    }

Можете ли вы помочь мне выяснить, что происходит?

Спасибо.

1 Ответ

0 голосов
/ 08 июня 2018
[Index(IsUnique = false)]
public int Id { get; set; }

Это не мешает идентификатору быть первичным ключом.Если бы это произошло, вы бы увидели еще одну ошибку, EF требует PK для ваших классов.

Вы только добавили дополнительный индекс в столбец Id.Не снято ограничение PK.

Так что наши первые подозрения кажутся правильными, вы загружаете кучу записей с дублирующимися значениями PK в память.При попытке SaveChanges() вы получите сообщение об ошибке или потеряете данные.

Простое исправление будет выглядеть как

public class MyModel
{
    [Key]
    public int ModelId { get; set; }  // auto filled, ignore where you don't need it

    //[Index(IsUnique = false)] -- not needed
    public int Id { get; set; }       
    public DateTime Date{ get; set; }
    ...
...