我有2个存储库,成员和个人。 Person Model包含一个可以为成员模型的可空参考属性。成员模型在成员资源库中定义,我想建立一个模式,确保它保持这种方式。然而,当我从人物回购中调用成员仓库中的方法时,我得到了
LINQ to Entities无法识别方法'System.Linq.IQueryable 1 [... IMember] Get(.. Entities,System.Linq.Expressions.Expression 1 [System.Func`2 [.. tblMember,System .Boolean]])'方法,并且此方法无法转换为商店表达式。“
虽然我理解这可以通过放入.asEnumerable()然后第二次选择来轻松解决,但是有一个成本意味着你做了2个查询而不是一个,你就失去了将方法公开为等待的能力。下面是我删除了一些非必要部分以清除的代码。我没有使用lambda,因为我没有找到一个好的方式来说让lambda表达式。我的目标是person.Member只是一个嵌套的选择。另请注意,事情的成员方面是一个非常丑陋的数据库,我无法控制,这些回购正在被分离是有原因的。提前致谢
public class MemberRepository : Interfaces.IRepository<IMemberBase, string>
{
private Data.LSAEntities entities { get; set; }
public MemberRepository(Data.LSAEntities entities)
{
this.entities = entities;
}
internal static IQueryable<IMember> Get(Data.LSAEntities entities, Expression<Func<tblMember, bool>> predicate)
{
return (from t in entities.tblMembers.Where(predicate)
let options = entities.tblDataOptions.Where(o => o.DataName == "MemberStatus")
select new Member()
{
MemberID = t.MemberID,
...
});
}
}
public class PersonRepository : IRepository<IPerson, int>
{
private Data.LSAEntities entities { get; set; }
public PersonRepository(Data.LSAEntities entities)
{
this.entities = entities;
}
public IQueryable<IPerson> Get(int key)
{
return (from p in entities.tblPersons
where p.PersonId == key
select new Person()
{
PersonId = p.PersonId,
...
Member = MemberRepository.Get(entities, m=> p.MemberId == m.MemberID).FirstOrDefault()
});
}
}
答案 0 :(得分:0)
这可能会对您有所帮助:
鉴于
var ans = from a in table
let b = a.TotalPrice / a.Quantity
where b > 500
select new {
PriceEa = b,
a.ID,
a.Description
};
转换为
var ans = table.Select(a => new { b = a.TotalPrice / a.Quantity, a })
.Where(ba => ba.b > 500)
.Select(ba => new {
PriceEa = ba.b,
ba.a.ID,
ba.a.Description
});
LINQ中查询理解语法中的let
子句被转换为Select
,在使用lambda语法时添加一个新字段来保存let值。