LINQ To SQL с целочисленным классом безопасного типа - PullRequest
3 голосов
/ 31 октября 2011

У меня есть следующий класс, разработанный для обеспечения механизма защиты типов для передачи Int64 в мой бизнес-уровень:

class ClientID {
    public ClientID(long i) { Value = i; }
    //... other constructors

    public long Value { get; private set; }

    public static bool operator ==(ClientID lhs, long rhs) {
        return lhs.Value == rhs;
    }
}

Есть несколько других операторов сравнения, плюс некоторые Object переопределения. Это позволяет мне написать код LINQ, который говорит:

ClientID searchID = something;

from i in someSQLdatasource
where i.ClientID == searchID
select i;

Синтаксис работает, но, конечно, LINQ to SQL не может сгенерировать код SQL для моего ClientID класса. Я мог бы явно ссылаться на свойство Value, но я думаю, что синтаксис, который я использовал, более элегантен.

Может ли кто-нибудь помочь мне заставить LINQ to SQL сгенерировать сравнение так, как если бы мой ClientID класс был Int64?

Ответы [ 2 ]

0 голосов
/ 27 апреля 2012

Интересно, что в версии LinqToSQL в ASP.NET 4.0 это больше не требуется, и мой класс очень хорошо переводится в SQL.То есть, следующий класс:

public class ObjectID {
    public Int64 Value { get { return m_Value; } set { m_Value = value; } }

    protected ObjectID(Int64 v) { Value = v; }
    protected ObjectID(String v) { Value = Int64.Parse(v); }
    protected ObjectID(System.Web.UI.WebControls.HiddenField v) { Value = v.Value == "" ? 0 : Int64.Parse(v.Value); }
    protected ObjectID(System.Web.UI.WebControls.CommandEventArgs v) { Value = Int64.Parse(v.CommandArgument.ToString()); }
    protected ObjectID(object v) { Value = Int64.Parse(v.ToString()); }

    public static bool operator ==(ObjectID lhs, ObjectID rhs) { return lhs.Value == rhs.Value; }
    public static bool operator !=(ObjectID lhs, ObjectID rhs) { return lhs.Value != rhs.Value; }

    public static implicit operator Int64(ObjectID c) { return c.Value; }

    public override bool Equals(object obj) {
        if (obj.GetType() == this.GetType()) return (ObjectID)obj == this;
        if (obj is Int64) return this.Value == (Int64)obj;
        return false;
    } // Equals

    public override int GetHashCode() {
        return Value.GetHashCode();
    } // GetHashCode

    public override string ToString() {
        return Value.ToString();
    } // ToString

    private Int64 m_Value;
} // class ObjectID

Позволяет мне написать Where (f => f.InvoiceID == ID)

и заставить LinqToSQL сделать необходимый переводЗатем я могу создавать классы, производные от ObjectID, и получать мои безопасные от типов контейнеры, которые работают прямо в SQL.

0 голосов
/ 05 ноября 2011

LINQ to SQL не имеет никакого способа заставить его что-то делать. Лучшее, на что вы можете надеяться, это переписать дерево выражений до того, как оно получит его, что нетривиально. http://damieng.com/blog/2009/06/24/client-side-properties-and-any-remote-linq-provider - простой пример того, как перехватить дерево и изменить то, что видят провайдеры.

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