none
Исключение An exception of type 'System.NotSupportedException' occurred in mscorlib.dll but was not handled in user code вLINQ запросе RRS feed

  • Вопрос

  • При выполнении linq запроса

    var result =    from joins in joinRepository.Joins
                          join battle in mybattles on joins.BattleID equals battle.ID
                          select joins;
    
    
    
    foreach (var item in result)
                {
                    ...
                }

    При старте цикла идет ошибка:
    An exception of type 'System.NotSupportedException' occurred in mscorlib.dll but was not handled in user code

    Additional information: Unable to create a constant value of type 'Battle'. Only primitive types or enumeration types are supported in this context.

    Что не так?

    • Изменено YatajgaEditor 25 февраля 2014 г. 19:03 Правка заглавия
    18 февраля 2014 г. 16:47

Ответы

  • Все как всегда просто :) .
    var result =
                          from joins in joinRepository.Joins.ToList()
                          join battle in mybattles on joins.BattleID equals battle.ID
                          select joins;

    • Помечено в качестве ответа Rio39 25 февраля 2014 г. 14:47
    25 февраля 2014 г. 14:47

Все ответы

  •  Уж извините но из вашего описания проблемы на ум приходят только танчики Battle City :)

    Приведите хотя бы инициализацию mybattles, joinRepository... что бы понять к каким типам они принадлежат

    18 февраля 2014 г. 17:38
  • Попробуйте описать проблему более подробно. Скорее всего, у вас mybattles коллекция в памяти, поэтому запрос не может быть транслирован в SQL. Попробуйте загрузить данные в память, потом объеденить: joinRepository.Joins.ToList().

    Сделаем содержимое сообщества лучше, вместе!

    18 февраля 2014 г. 19:11
    Модератор
  • mybattles - результат запроса.
    battleRepository и joinRepository - dbcontext. Собственно связь с базой через EntityFramework.
    battleRepository.Battles и joinRepository.Joins - таблицы базы.

    var mybattles = battleRepository.Battles.Where(m => m.M1ID == userid).ToList();

    18 февраля 2014 г. 20:20
  • Модели таблиц:

     public class Join
        {
            [Required]
            [Key]
            public int ID { get; set; }
            [ForeignKey("Battle")]
            public int BattleID { get; set; }
            public virtual Battle Battle { get; set; }
    
            [ForeignKey("User")]
            public string UserID { get; set; }
            public virtual ApplicationUser User { get; set; }
        }
    
    public class Battle
        {
            [Required]
            [Key]
            public int ID { get; set; }
            [ForeignKey("Member1")]
            public string M1ID { get; set; }
            public virtual ApplicationUser Member1 { get; set; }
            [ForeignKey("Member2")]
            public string M2ID { get; set; }
            public virtual ApplicationUser Member2 { get; set; }
            public DateTime StartDate { get; set; }
            public DateTime? FinishDate { get; set; }
            public string Level { get; set; }
            public string M1Count { get; set; }
            public string M2Count { get; set; }
            [ForeignKey("Winner")]
            public string WinerID { get; set; }
            public virtual ApplicationUser Winner { get; set; }
            public virtual List<Video> Videos { get; set; }
        }

    18 февраля 2014 г. 20:21
  • Хорошо, вечером посмотрю.

    Сделаем содержимое сообщества лучше, вместе!

    19 февраля 2014 г. 12:25
    Модератор
  • попробуйте вот так
    var result =    from joins in joinRepository.Joins.AsEnumerble()
                          join battle in mybattles.AsEnumerble() on joins.BattleID equals battle.ID
                          select joins;

    19 февраля 2014 г. 12:40
  • Еще немного уточню.
    Вот такой запрос мне надо сделать, он работает корректно через server explorer:

    Select Joins.BattleID from Joins
    inner join Battles on joins.BattleID = Battles.ID
    where Joins.UserID = '7f8b0d81-6948-4fca-8af9-e2e66fdedb73'


    UserID взят для примера.

    Нужно этот же запрос сделать через LINQ.
    Переделал немного, но та же ошибка:

    var result = from joins in joinRepository.Joins.AsEnumerable()
                             join battle in battleRepository.Battles.AsEnumerable() on joins.BattleID equals battle.ID
                             where joins.UserID==User.Identity.GetUserId()
                             select joins;
    

    или

    var result = from joins in joinRepository.Joins
                             join battle in battleRepository.Battles on joins.BattleID equals battle.ID
                             where joins.UserID==User.Identity.GetUserId()
                             select joins;

    Все та же ошибка.


    • Изменено Rio39 19 февраля 2014 г. 18:19
    19 февраля 2014 г. 18:19
  • Разложите на части и попробуйте просто извлечь каждую последовательность:

    joinRepository.Joins и battleRepository.Battles

    у вас точно обе коллекции не null??(вероятнее всего одна из них null, потому что на первый взгляд запрос ваш правильный и дело видимо не в нем ) в обоих есть battleID одного типа?

    19 февраля 2014 г. 19:12
  • Все как всегда просто :) .
    var result =
                          from joins in joinRepository.Joins.ToList()
                          join battle in mybattles on joins.BattleID equals battle.ID
                          select joins;

    • Помечено в качестве ответа Rio39 25 февраля 2014 г. 14:47
    25 февраля 2014 г. 14:47
  • Я же вам предложил этот вариант "joinRepository.Joins.ToList()." в самом начале.

    Сделаем содержимое сообщества лучше, вместе!

    25 февраля 2014 г. 19:01
    Модератор