Почему linq to sql не разрешит meber с модификатором наследования override в предложении where? - PullRequest
1 голос
/ 08 июля 2010

Я получаю InvalidOperationException при попытке запустить этот код:

database.Produkts.SingleOrDefault<Produkt>(x => x.Kod == "123")

Это происходит только тогда, когда свойство Kod имеет модификатор переопределения.Мне это нужно, потому что класс сущности является производным от другого класса, который находится в отдельной сборке.

Вот как определяются классы:

Базовый класс:

namespace Interfaces.Model
{
    [DataContract(Name = "Produkt", Namespace = "")]    
    public class Produkt
    {
        [DataMember]        
        public virtual string Kod { get; set; }

...

Класс, сгенерированный Linq:

namespace DAL.Linq
{

  [Table(Name="dbo.Produkt")]
  public partial class Produkt : INotifyPropertyChanging, INotifyPropertyChanged
  {
        [Column(Storage="_Kod", DbType="NVarChar(50) NOT NULL", CanBeNull=false)]
        public override string Kod
        {
            get
            {
                return this._Kod;
            }
            set
            {
                if ((this._Kod != value))
                {
                    this.OnKodChanging(value);
                    this.SendPropertyChanging();
                    this._Kod = value;
                    this.SendPropertyChanged("Kod");
                    this.OnKodChanged();
                }
            }
        }
...

И вторая часть определения:

namespace DAL.Linq
{
    [DataContract(Name = "Produkt", Namespace = "")]    
    partial class Produkt : Interfaces.Model.Produkt
    {
    }
}

Теперь извлекаем все экземпляры из базы данных (без фильтра / где caluse) будет работать просто отлично.Только то, что построение предиката, включающего переопределенное свойство, не будет.

Я предполагаю, что это какая-то проблема, связанная с получением атрибутов свойства с отражением, поскольку исключение выдается из метода GetDataMember изSystem.Data.Linq.Mapping.MetaType класс.

Мой реальный вопрос: если это ошибка Linq или я могу как-то заставить Linq распознавать это свойство для сопоставления атрибутов?

Ответы [ 2 ]

1 голос
/ 24 августа 2010

Найден обходной путь: http://social.msdn.microsoft.com/Forums/en-US/linqprojectgeneral/thread/016ad28b-f813-4f26-9e70-2265a1943bad

Короче говоря: запрос работает после его изменения следующим образом:

database.Produkts.SingleOrDefault<Produkt>(x => ((DAL.Linq.Produkt)x).Kod == "123")

Приведение должно быть устаревшим (и Fi Resharper помечает его кактакие) но, очевидно, это имеет значение, когда методы отражения применяются к результирующим объектам Expression.

1 голос
/ 08 июля 2010

Во всех частях класса ключевое слово должно быть частичным.

Ваша структура кода действительно странная, как вы вообще определяете, какую реализацию вы вызываете каждый раз (если есть разные реализации)?

Возможно, вы можете создать несколько классов, наследующих Produkt, вместо нескольких его частей.

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