保持实体框架不执行属性或扩展方法

时间:2013-03-13 23:10:22

标签: linq entity-framework-5

我正在使用EF5 Code First型号。请考虑以下实体框架查询:

var results = from i in context.Table1
            where i.ID == Id // passed in
            select new TableInfo()
            {
                Name = i.Name,
                ActionDate = i.Action.ActionDate,
                CreatedDate = i.Action.CreatedDate,
                CreatedBy = i.Action.CreatedBy.FullName
            };

FullName属性因此被定义:

[NotMapped]
[Display(Name = "Full Name")]
public string FullName
{
    get
    {
        string ret = string.Empty;
        if (String.IsNullOrEmpty(LAST_NAME) || String.IsNullOrEmpty(FIRST_NAME))
        {
            return "";
        }
        else
        {
            return string.Format("{0}, {1}", LAST_NAME, FIRST_NAME);
        }

    }
}

我收到错误:

  

LINQ to Entities不支持指定的类型成员'FullName'。仅支持初始化程序,实体成员和实体导航属性。

如果我创建一个扩展方法来执行相同的操作,我会收到类似的错误。所以问题是如何让EF不要试图在数据存储上运行这些东西?

1 个答案:

答案 0 :(得分:2)

问题是select子句的初始值设定项中的表达式:

CreatedBy = i.Action.CreatedBy.FullName

这导致Linq-to-Entity提供程序尝试查找名为“FullName”的属性的映射。如果您尝试使用扩展方法,则同样适用。

你可以这样做:

var results = 
    from i in context.Table1
    where i.ID == Id // passed in
    select new TableInfo()
    {
        Name = i.Name,
        ActionDate = i.Action.ActionDate,
        CreatedDate = i.Action.CreatedDate,
        CreatedBy = i.Action.CreatedBy
    };

然后使用item.CreatedBy.FullName通过自定义属性访问该名称