代码之家  ›  专栏  ›  技术社区  ›  Ash Machine

实现IEnumerable

  •  4
  • Ash Machine  · 技术社区  · 16 年前

    我正在使用LINQ,很难理解如何使新的“域模型”类在LINQ中工作,同时跨表查询。我正在使用LINQtoSQL和.NET3.5中的C#。

    假设我想要一个扩展的客户机类:

    public class ExtendedClient 
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public string strVal { get; set; }
    }
    

    在我的数据层中,我想从两个表中填充它(dc是我的DataContext):

    public ExtendedClient getExtendedClient(int clientID)
    {
        var c = dc.GetTable<tClient>();
        var cs = dc.GetTable<tClientSetting>();
        var q = from client in c
                join setting in cs
                on client.ClientID equals setting.ClientID
                where client.ClientID == clientID
                select new ExtendedClient { client, setting.strValue };
        return q;   
    }
    

    我试图返回表tClient中的行加上tClientSetting中的一个额外列。

    我遇到的恼人错误有: 无法使用集合初始值设定项初始化类型“ExtendedClient”,因为它未实现“System.Collections.IEnumerable” 和

    我必须这样做吗 每一次 我想要一个特殊的对象?提前谢谢。

    2 回复  |  直到 16 年前
        1
  •  6
  •   Mehrdad Afshari    16 年前
    public ExtendedClient getExtendedClient(int clientID)
    {
        var c = dc.GetTable<tClient>();
        var cs = dc.GetTable<tClientSetting>();
        var q = from client in c
                join setting in cs
                on client.ClientID equals setting.ClientID
                where client.ClientID == clientID
                select new ExtendedClient { ID = client.ClientID, Name = client.Name, strVal = setting.strValue };
        return q.Single();
    }
    

    你也得做类似的事情 每次你需要的时候 专门对象 . 如果不需要返回,则不必指定类型,也不需要特殊的类。您可以使用匿名类型:

    from client in c
    join setting in cs
    on client.ClientID equals setting.ClientID
    where client.ClientID == clientID
    select new { ID = client.ClientID, Name = client.Name, strVal = setting.strValue };
    
        2
  •  0
  •   Andrey Shchekin    16 年前

    为什么要使用特殊的类型?

    我想你能做到 client.Settings.strValue 如果设置客户端设置关系以创建属性 Client.Settings Settings.Client ).据我记忆所及,这种配置在LINQ中是可能的。