2013-03-21 84 views
0

我试图使用推荐LLBLGEN语法查询投影(http://www.llblgen.com/documentation/3.5/LLBLGen%20Pro%20RTF/Using%20the%20generated%20code/Adapter/gencode_usingentityview_adapter.htm#projectionsLINQ到对象查询LLBLGEN投影

IEntityView2 view = table.DefaultView; 
List<A1AllocationHelp1TableDTO> something = 
    (from c in view 
    select new A1AllocationHelp1TableDTO 
    { 
     RecordStatus = c.RecordStatus, 
     UniqueIdent = c.UniqueIdent 
    }).ToList(); 

但我发现了关于“选择”这个错误:

The type arguments for method 'IEnumerable<TResult> 
System.Linq.Enumerable.Select<TSource, TResult>(this IEnumerable<TSource>, 
Func<TSource, TResult>)' cannot be inferred from the query. 

搞笑的是,同样的作品只是在VB.Net罚款

Dim view As IEntityView2 = table.DefaultView 
Dim something As List(Of A1AllocationHelp1TableDTO) = _ 
    (From c In view 
    Select New A1AllocationHelp1TableDTO With _ 
      { 
       .RecordStatus = c.RecordStatus, _ 
       .UniqueIdent = c.UniqueIdent 
      }).ToList() 

我使用VS2010,.NET 4和LLBLGen 2.6。 不知道如何解决这个任何人都可以给我一只手?

由于

编辑:

IEntityView2由LLBLGEN产生,这是它的定义

public interface IEntityView2 : IEnumerable 
{ 
    bool AllowEdit { get; set; } 
    bool AllowNew { get; set; } 
    bool AllowRemove { get; set; } 
    int Count { get; } 
    PostCollectionChangeAction DataChangeAction { get; set; } 
    IPredicate Filter { get; set; } 
    IEntityCollection2 RelatedCollection { get; } 
    ISortExpression Sorter { get; set; } 
    IEntity2 this[int index] { get; } 
    event ListChangedEventHandler ListChanged; 
    bool Contains(IEntity2 value); 
    void CreateProjection(List<IEntityPropertyProjector> propertyProjectors, DataTable destination); 
    void CreateProjection(List<IEntityPropertyProjector> propertyProjectors, IEntityCollection2 destination); 
    void CreateProjection(List<IEntityPropertyProjector> propertyProjectors, IEntityDataProjector projector); 
    void CreateProjection(List<IEntityPropertyProjector> propertyProjectors, DataTable destination, bool allowDuplicates); 
    void CreateProjection(List<IEntityPropertyProjector> propertyProjectors, IEntityCollection2 destination, bool allowDuplicates); 
    void CreateProjection(List<IEntityPropertyProjector> propertyProjectors, IEntityDataProjector projector, bool allowDuplicates); 
    void CreateProjection(List<IEntityPropertyProjector> propertyProjectors, DataTable destination, bool allowDuplicates, IPredicate filter); 
    void CreateProjection(List<IEntityPropertyProjector> propertyProjectors, IEntityCollection2 destination, bool allowDuplicates, IPredicate filter); 
    void CreateProjection(List<IEntityPropertyProjector> propertyProjectors, IEntityDataProjector projector, bool allowDuplicates, IPredicate filter); 
    int IndexOf(IEntity2 value); 
    IEntityCollection2 ToEntityCollection(); 
    IEntityCollection2 ToEntityCollection(int startIndex); 
} 
+0

请显示IEntityView2的定义。 – 2013-03-21 08:28:10

+0

我编辑添加定义 – kooshka 2013-03-21 08:45:11

回答

2

IEntityView2继承了非通用接口IEnumerable。然而Select方法需要通用版本。这就是为什么你会收到错误。

假设你想打开的属性上IEntity2定义,下面的工作:

view.Cast<IEntity2>() 
    .Select(c => new A1AllocationHelp1TableDTO 
      { 
       RecordStatus = c.RecordStatus, 
       UniqueIdent = c.UniqueIdent 
      }) 
    .ToList(); 

它工作在VB.NET,因为它使用后期绑定。你可以很容易地看到这在下面的示例:

Dim view As IEntityView2 = table.DefaultView 
Dim something As List(Of A1AllocationHelp1TableDTO) = _ 
(From c In view 
Select New A1AllocationHelp1TableDTO With _ 
     { 
      .RecordStatus = c.IDontExist _ 
     }).ToList() 

我使用了一个不存在的属性(IDontExist)。此代码仍然编译,但在运行时抛出一个异常:

MissingMemberException: Public member 'IDontExist' on type 'IEntity2' not found. 
    at Microsoft.VisualBasic.CompilerServices.Symbols.Container.GetMembers(String& MemberName, Boolean ReportErrors) 
    at Microsoft.VisualBasic.CompilerServices.NewLateBinding.ObjectLateGet(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack) 
    at Microsoft.VisualBasic.CompilerServices.NewLateBinding.LateGet(Object Instance, Type Type, String MemberName, Object[] Arguments, String[] ArgumentNames, Type[] TypeArguments, Boolean[] CopyBack) 
    at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
    at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) 
    at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) 
+0

演员实际上是查看.Cast ()。选择(c => ...但这正是我需要的 – kooshka 2013-03-21 09:00:56

+0

@kooshka:但为什么选择呢?如果'view'中的项目已经是目标对象,您只需要这样做:'view.Cast ()。ToList();'。不需要创建新对象 – 2013-03-21 09:02:43

+0

我的不好。意思是Cast 。view包含A1AllocationHelp1Entity的实例,它仅在运行时定义,因为这是在WCF中,因此我需要返回一个静态定义的DTO – kooshka 2013-03-21 09:11:34

0

.DefaultView返回一个类型的视图,它实现IEntityView2,但你不应该将其转换为IEntityView2,因为你那么失去了泛型类型。所以你应该这样做:

List<A1AllocationHelp1TableDTO> something = 
    (from c in table.DefaultView 
    select new A1AllocationHelp1TableDTO 
    { 
     RecordStatus = c.RecordStatus, 
     UniqueIdent = c.UniqueIdent 
    }).ToList(); 

这样,编译器知道视图的泛型类型。

+0

谢谢Frans,但那也行不通,我仍然得到相同的错误。表的类型是IEntityCollection2 – kooshka 2013-03-21 09:20:47