Linq to sql 具有类型安全整数类的LINQ到SQL

Linq to sql 具有类型安全整数类的LINQ到SQL,linq-to-sql,c#-4.0,Linq To Sql,C# 4.0,我设计了以下类,以提供类型安全机制,将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.V

我设计了以下类,以提供类型安全机制,将
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;
    }
}
还有一些其他比较运算符,以及一些
对象
覆盖。这使我能够编写LINQ代码,其中说明:

ClientID searchID = something;

from i in someSQLdatasource
where i.ClientID == searchID
select i;
语法是有效的,但是linqtosql当然不能为我的
ClientID
类生成SQL代码。我可以显式地引用
Value
属性,但我认为我使用的语法更优雅


有谁能帮助我将LINQ强制为SQL以生成比较,就像我的
ClientID
类是
Int64
一样?

LINQ-to-SQL没有任何强制它执行操作的方法。您所能期望的最好结果就是在得到表达式树之前重写它,这是非常重要的。这是一个简单的示例,说明了如何截取树并修改提供者看到的内容。

有趣的是,在ASP.NET 4.0中的LinqToSQL版本中,这已不再需要,并且我的类可以很好地转换为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
允许我写作 其中(f=>f.InvoiceID==ID)


并让LinqToSQL进行必要的翻译。然后,我可以构建从ObjectID派生的类,并获得在SQL中正常工作的类型安全容器。

是否尝试定义从
ClientID
Int64
的隐式转换运算符?我尝试过:公共静态隐式运算符Int64(ClientID c){返回c.Value;}同样的问题。不只是将Int64声明为属性类型而不是类,你认为你得到了什么?哦,非常好。我在许多表中使用bigint作为主键。当我想查找它们时,我会将它们从表示层传递到中间层。因为我的公司在同一个数据库中有多个客户,所以几乎每个中间层调用都包括代表该客户的Int64。所有这些都意味着我的中间层查找方法中有很大一部分具有2个或更多Int64参数,并且很难保持它们的直线性。通过将它们中的一些或全部包装在这些shell中,编译器迫使我获得正确的顺序。这是您的参考。我浏览了整个互联网,不知怎么的,从来没有看到过你的博客。我很确定这就是我想要的,我会在周一有机会带上它。谢谢。我已经在你的博客上做了一个跟进,试图让它为我工作。真不敢相信。你什么都没改?事实上,我可以把代码取出来。上面的类工作得很好。您能捕获使用SQL Server Profiler执行的SQL吗?我的猜测是where正在客户端执行。L2S有时会默默地这样做。编辑:如果它这样做,你的表现将被破坏。好建议。我这样做了,生成的SQL在WHERE子句中包含ID列。因此,事实上,在修订版的某个地方,L2S开始想出如何更聪明地在表达式树中爬行。