实现IEnumerable

时间:2009-02-16 07:11:28

标签: linq-to-sql generics

我正在使用LINQ,并且很难理解如何在查询跨表时使LINQ中的新“域模型”类工作。我正在使用Linq to SQL和.NET 3.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' 和 无法将类型'System.Linq.IQueryable'隐式转换为'ExtendedClient'。存在显式转换(您是否错过了演员?)

我意识到这是一个基本错误,但我无法确定如何实现IEnumerable,因为我找不到一个例子。

每次我是否需要这样做我想要一个专门的对象?提前谢谢。

2 个答案:

答案 0 :(得分:6)

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 };

答案 1 :(得分:0)

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

如果您设置客户端设置关系以创建属性client.Settings.strValue(而不是Client.Settings),我认为您可以Settings.Client。据我所知,在LINQ中可以进行这样的配置。