我正在尝试使用推荐的LLBLGen语法来查询投影(http://www.llblgen.com/documentation/3.5/LLBLGen%20Pro%20RTF/Using%20the%20generated%20code/Adapter/gencode_usingentityview_adapter.htm#projections)
IEntityView2 view = table.DefaultView;
List<A1AllocationHelp1TableDTO> something =
(from c in view
select new A1AllocationHelp1TableDTO
{
RecordStatus = c.RecordStatus,
UniqueIdent = c.UniqueIdent
}).ToList();
但是我在'select'上收到了这个错误:
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 :(得分: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)
答案 1 :(得分:0)
.DefaultView返回一个类型化视图,它实现了IEntityView2,但你不应该将其转换为IEntityView2,因为你失去了泛型类型。所以你应该做的:
List<A1AllocationHelp1TableDTO> something =
(from c in table.DefaultView
select new A1AllocationHelp1TableDTO
{
RecordStatus = c.RecordStatus,
UniqueIdent = c.UniqueIdent
}).ToList();
这样,编译器就知道视图的泛型类型。