当在分部类中添加新属性时,在LINQ to Entities中不支持指定的类型成员

本文关键字:不支持 Entities to LINQ 类型 成员 添加 新属性 属性 | 更新日期: 2023-09-27 18:10:42

我有一个实体框架的EDMX生成类有两个属性

public partial class Contact : EntityBase
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

我需要额外的属性,应该通过连接FirstName和LastName返回FullName。所以我为它创建了一个局部类。

public partial class Contact
{
    public string FullName
    {
        get { return string.Format("{0}{1}", FirstName, !string.IsNullOrEmpty(LastName) ? " " + LastName : String.Empty); }
    }
}

现在,我创建了一个LINQ表达式来搜索与FullName匹配的"steve John"记录。

Expression<Func<Contact, bool>> cntExpression = p => 
                p.FullName.ToLower().Trim().Contains("Steeve John");

我将这个表达式传递给业务逻辑以检索IQueryable实例。

            IQueryable<Contact> qryContact = _cntMgr.GetFiltered(cntExpression);

代码在这行代码处失败:

            var contactLeads = qryContact.Select(
                  s => s.Leads.Where(a => a.IsActive).GroupBy(a => a.ContactId).Select(a => a.FirstOrDefault())).ToList();

我得到的错误是:

The specified type member 'FullName' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.

请帮我解决这个问题。

当在分部类中添加新属性时,在LINQ to Entities中不支持指定的类型成员

Linq to entities不知道string。在FullName中使用的格式。你可以试试这样做:

Expression<Func<Contact, bool>> cntExpression = p => 
(p.FirstName + " " + p.LastName).ToLower().Trim().Contains("Steeve John");

Expression<Func<Contact, bool>> cntExpression = p => 
(p.FirstName == "Steeve" && p.LastName == "John");

您也可以首先获得Leads作为列表。那么你的原始代码应该也可以工作:

s.Leads.ToList().Where [...]

任何自定义属性都不能用于查询表达式;基本上,错误是说没有"名称"(或者我认为这应该是"FullName"?如果没有,"Name"来自哪里)字段在数据库中,至少在查询已经对数据库运行之前。之后,你可以很好地使用它。查询在这里失败,因为ToList()对数据库执行了查询,这时就发生了验证。

首先查询记录,然后在调用ToList后使用FullName,它将正常工作。