结合Linq-Entity语句

时间:2018-05-14 19:10:51

标签: c# linq entity-framework-6

我有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()
                });
    }
}

1 个答案:

答案 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值。