如何轻松地将linq结果转换为Business Object Collection <t> </t>

时间:2011-02-02 07:02:12

标签: linq casting business-objects

我有业务对象集合

我想使用linq过滤行,但注意到它返回IEnumerable,然后无法转换到我的BOC

E.g我不能那样做

BOC <Client> bocCLients = (BOC <Client>) 
                          from C in ClientsColl where C.ClientId == 100 select C

我已经通过循环linq结果并将返回的对象添加到我的原始集合中来解决这个问题。

我想知道是否有更简单的方法?

2 个答案:

答案 0 :(得分:1)

var bocCLients = ClientsColl.Where(c => c.ClientId == 100).ToList();

或者

var bocCLients = new BOC<Client>(ClientsColl.Where(c => c.ClientId == 100));

修改 或者也许是AddRange扩展

public static void AddRange<T>(this ICollection<T> colSource, IEnumerable<T> collection)
        {
            if (colSource is List<T>)
                ((List<T>)colSource).AddRange(collection); //If List use build in optimized AddRange function
            else
            {
                foreach (var item in collection)
                    colSource.Add(item);
            }
        }

答案 1 :(得分:1)

这看起来是创建扩展方法的绝佳机会。通过查看您的问题,看起来ClientsColl已经包含Client类型的对象。在这种情况下,您的foreach循环解决方案是理想的。但是,您可以将该解决方案封装到扩展方法中,并使其可重用且易于阅读。

以下是一个示例:

 public static BOC<T> ToBOC<T>(this IEnumerable<T> sourceCollection)
 {
     var boc = new BOC<T>();
     foreach (T item in sourceCollection)
     {
         boc.Add(item);
     }
     return boc;
 }

使用此扩展方法,您只需按如下方式编写查询:

BOC<Client> bocClients =
(
    from C in ClientsColl
    where C.ClientID == 100
    select C
).ToBOC();

修改

跟进更通用的扩展方法到ICollection的想法,但保持原来的问题是执行一种Cast到特定类型的集合,现在拥有BOC实现ICollection的新信息,这是一个更通用的扩展方法和用于执行作业的用法:

public static TCollection ToICollection<T, TCollection>(this IEnumerable<T> sourceCollection)
        where TCollection : ICollection<T>, new()
    {
        TCollection col = new TCollection();
        foreach (T item in sourceCollection)
        {
            col.Add(item);
        }
        return col;
    }

用法:

BOC<Client> bocClients2 =
(
    from C in ClientsColl
    where C.ClientID == 100
    select C
).ToICollection<Client, BOC<Client>>();

这看起来更有用吗?让我知道你的想法。