LINQ查询中的实体GetType

时间:2014-08-12 08:52:45

标签: c# linq entity-framework linq-to-sql linq-to-entities

我有一个想要选择我的实体类型的LINQ查询:

    static void Main(string[] args)
    {
        using (var currentContext = new MyContext())
        {
            var x = (from c in currentContext.GeneralAccounts
                    select new  { CType = c.GetType() }).ToList();
        }
    }

但是这个查询出错:

错误:LINQ to Entities无法识别方法' System.Type GetType()'方法,并且此方法无法转换为商店表达式。

2 个答案:

答案 0 :(得分:6)

你可以尝试这个:

var result  = (from c in currentContext.GeneralAccounts
               select c).AsEnumerable().Select(x=> new  { CType = x.GetType() }).ToList();

您收到错误是因为Linq表达式被转换为SQL,并且由于x.GetType()无法转换为SQL,因此您需要首先通过调用AsEnumerable来检索记录,然后获取其类型。

答案 1 :(得分:4)

使用像这样的查询时

from c in currentContext.GeneralAccounts
select new  { CType = c.GetType() }

然后实体框架或LINQ-to-SQL将尝试从中形成SQL语句。但是对于某些东西,没有等效的SQL语句,在你的情况下,调用GetType()就是问题。

您要做的是在客户端而不是数据库服务器上执行GetType(),因此您必须将查询更改为

// this can be translated into a SQL query
(from c in currentContext.GeneralAccounts
 select c)
// turns the IQueryable into an IEnumerable, which means
// from now on LINQ-to-Objects is used
.AsEnumerable()
.Select(p => new { CType = p.GetType() })
.ToList()