我有一个实体框架的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表达式来搜索匹配“Steeve John”与FullName匹配的记录。
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.
请帮我解决这个问题。
提前致谢。
答案 0 :(得分:0)
Linq to entities不知道你在FullName中使用的string.Format。你可以试试这样的东西:
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 [...]
答案 1 :(得分:0)
任何自定义属性都不能在查询表达式中使用;基本上该错误是说没有“名称”(或者我认为这应该是“FullName”?如果没有,“名称”来自)数据库中的字段,至少在查询针对数据库运行之前。之后,你可以使用它。查询失败,因为ToList()对数据库执行它,即验证发生时。
首先查询记录,然后在调用ToList后使用FullName,它将正常工作。