从dbset< t>中选择某些字段 [英] select certain fields from dbset<t>

查看:167
本文介绍了从dbset< t>中选择某些字段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用的是EF4.1,对于性能问题,我需要从DbSet中只选择几个字段,该字段映射到sql server上的视图。



任何关于如何做的想法?



所以从客户端选择字段会返回以下错误。

  var result = context.Customers.Select(c => new Customer {Name = c.Name,Age = c.Age})ToList(); 

实体或复合类型客户不能在LINQ to Entities查询中构建。
在System.Data.Objects.ELinq.ExpressionConverter.CheckInitializerType(类型类型)
在System.Data.Objects.ELinq.ExpressionConverter.MemberInitTranslator.TypedTranslate(ExpressionConverter parent,MemberInitExpression linq)
at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent,Expression linq)
在System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
在System.Data .Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda,DbExpression input)
在System.Data.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda,DbExpression input,DbExpressionBinding& binding)
在System.Data .Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent,MethodCallExpression调用,DbExpression& source,DbExpressionBinding& sourceBinding,DbExpression& lambda)
在Sys temp.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SelectTranslator.Translate sequenceMethod)
在System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent,MethodCallExpression linq)
在System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent ,Expression linq)
在System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
在System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent,MethodCallExpression调用,DbExpression&来源,DbExpressionBinding& sourceBinding,DbExpression& lambda)
在System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent,MethodCallExpression调用)
在System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate( ExpressionConverter parent,MethodCallExpression调用,SequenceMethod sequenceMethod)
在System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent,MethodCallExpression linq)
在System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator `1.Translate(ExpressionConverter parent,Expression linq)
在System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
在System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator。 Translate(ExpressionConverter parent,MethodCallExpression调用,DbExpression& source,DbExpressionBinding& sourceBinding,DbExpression& lambda)
在System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent,MethodCallExpression调用)
在System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter parent,MethodCallExpression调用,SequenceMethod sequenceMethod)
在System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent,MethodCallExpression linq)
在System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate( ExpressionConverter parent,Expression linq)
在System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
在System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.AggregateTranslator.Translate(ExpressionConverter parent, MethodCallExpression调用)
在System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Tra nslate(ExpressionConverter parent,MethodCallExpression调用,SequenceMethod sequenceMethod)
在System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent,MethodCallExpression linq)
在System.Data.Objects.ELinq.ExpressionConverter .TypedTranslator`1.Translate(ExpressionConverter parent,Expression linq)
在System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
在System.Data.Objects.ELinq.ExpressionConverter.Convert( )
在System.Data.Objects.ELinq.ELinqQueryState.GetExecutionPlan(Nullable`1 forMergeOption)
在System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)
在System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable< T> .GetEnumerator()
在System.Linq.Enumerable.Single [TSource](IEnumerable`1 source)
at System.Data.Objects.ELinq.ObjectQueryProvider< GetElementFunction> b__3 [TResult](IEnumerabl e`1序列)
在System.Data.Objects.ELinq.ObjectQueryProvider.ExecuteSingle [TResult](IEnumerable`1查询,表达式queryRoot)
在System.Data.Objects.ELinq.ObjectQueryProvider.System。 Linq.IQueryProvider.Execute [S](表达式表达式)
在System.Data.Entity.Internal.Linq.DbQueryProvider.Execute [TResult](表达式表达式)
在System.Linq.Queryable.Count [ TSource](IQueryable`1 source)


解决方案

视图设置正确,客户是您的上下文中的 DbSet< Customer> 属性。

  var result = context.Customers.Select(c =>新的{c.Name,c.Age,c.AnyOtherProperty}); 

编辑:使用自己的类而不是匿名类型显示。

  var result = context.Customers.Select(c => new YourClassName {c.Name,c.Age,c.AnyOtherProperty}); 


I am using EF4.1, and for performance issues I need to select only a few fields from a DbSet which is mapped to a view on the sql server.

Any ideas about how to do that?

so selecting fields from Customer would return the below error.

var result = context.Customers.Select(c => new Customer{ Name = c.Name,Age = c.Age}).ToList();

The entity or complex type 'Customer' cannot be constructed in a LINQ to Entities query.
   at System.Data.Objects.ELinq.ExpressionConverter.CheckInitializerType(Type type)
   at System.Data.Objects.ELinq.ExpressionConverter.MemberInitTranslator.TypedTranslate(ExpressionConverter parent, MemberInitExpression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input)
   at System.Data.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input, DbExpressionBinding& binding)
   at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, DbExpression& source, DbExpressionBinding& sourceBinding, DbExpression& lambda)
   at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SelectTranslator.Translate(ExpressionConverter parent, MethodCallExpression call)
   at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, SequenceMethod sequenceMethod)
   at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, DbExpression& source, DbExpressionBinding& sourceBinding, DbExpression& lambda)
   at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call)
   at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, SequenceMethod sequenceMethod)
   at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, DbExpression& source, DbExpressionBinding& sourceBinding, DbExpression& lambda)
   at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call)
   at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, SequenceMethod sequenceMethod)
   at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.AggregateTranslator.Translate(ExpressionConverter parent, MethodCallExpression call)
   at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, SequenceMethod sequenceMethod)
   at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
   at System.Data.Objects.ELinq.ExpressionConverter.Convert()
   at System.Data.Objects.ELinq.ELinqQueryState.GetExecutionPlan(Nullable`1 forMergeOption)
   at System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)
   at System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator()
   at System.Linq.Enumerable.Single[TSource](IEnumerable`1 source)
   at System.Data.Objects.ELinq.ObjectQueryProvider.<GetElementFunction>b__3[TResult](IEnumerable`1 sequence)
   at System.Data.Objects.ELinq.ObjectQueryProvider.ExecuteSingle[TResult](IEnumerable`1 query, Expression queryRoot)
   at System.Data.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute[S](Expression expression)
   at System.Data.Entity.Internal.Linq.DbQueryProvider.Execute[TResult](Expression expression)
   at System.Linq.Queryable.Count[TSource](IQueryable`1 source)

解决方案

Assuming your mapping to the view is setup correctly and where Customers is a DbSet<Customer> property on your Context.

var result = context.Customers.Select(c => new {c.Name,c.Age, c.AnyOtherProperty});

Edit: To show using your own class rather than an anonymous type.

var result = context.Customers.Select(c => new YourClassName{c.Name,c.Age, c.AnyOtherProperty});

这篇关于从dbset&lt; t&gt;中选择某些字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆