如何重用已在其他类库中定义的linq方法

时间:2013-10-17 05:33:47

标签: c# linq entity-framework

我有两个数据访问类库,A.csproj和B.csproj。每个都有一个edmx。这两个edmx包含来自两个不同数据库的实体。 A.csproj引用B.DLL。 A.csproj中的A类使用LINQ查询A.edmx中的实体以返回IEnumerable< dtoResultA>。 B.csproj中的B类到B.edmx也返回IEnumerable< dtoResultB>。

我应该怎么做才能直接调用B.csproj中定义的getUserBenefitDetail()作为classA.getUserStuff()的LINQ查询的一部分?

A.csproj

public class dtoResultA{
      int userID {get;set;}
      IEnumerable<userPermissions> permissions{get;set;}
      IEnumerable<dtoResultB> benefits{get;set;}
}  

public class A{
  public IEnumerable<dtoResultA> getUserStuff(int UserId){
    var result = from p in contextA.userPermission.Where(x=>x.userId = UserId)
                 let b = getUserBenefitDetail(UserId) /*<--not sure how */
                 select new dtoResultA{
                   userID = c.userId,
                   permissions = p,
                   benefits = b
                 }
  }
}

B.csproj

public class B{
  public IEnumerable<dtoResultB> getUserBenefitDetail(int UserId){
    var result = from b in contextB.benefits.Where(x=>x.userId = UserId)
                 select new dtoResultB{
                   userID = c.userId,
                   benefits = b,
                   beneficiaries = b.beneficiaries
                 }
  }
}

2 个答案:

答案 0 :(得分:0)

最直接的方式是:

public class A{
  public IEnumerable<dtoResultA> getUserStuff(int UserId){
    var result = from p in contextA.userPermission.Where(x=>x.userId = UserId)
                 select new dtoResultA{
                   userID = c.userId,
                   permissions = p,
                   benefits = getUserBenefitDetail(UserId)
                 }
  }
}

答案 1 :(得分:0)

这不是问题,因为你有2个项目。这是一个问题,因为您已经使用方法定义了一个B类,但是您没有B的实例,并且您需要一个实例来调用方法。

您可以选择创建B的实例,或者使您的方法保持静态。可以在没有实例的情况下调用静态方法,它不再是一个方法,它更像是一个函数。

使用实例:

public class A
{
  public IEnumerable<dtoResultA> getUserStuff(int UserId)
  {
    var bInstance = new B();
    var result = from p in contextA.userPermission.Where(x=>x.userId = UserId)
                 let b = bInstance.getUserBenefitDetail(UserId)
                 select new dtoResultA
                 {
                   userID = c.userId,
                   permissions = p,
                   benefits = b
                 }
  }
}

使用静态类:

public class B
{
  public static IEnumerable<dtoResultB> getUserBenefitDetail(int UserId)
  {
    return stuff.....
  }
}

public class A
{
  public IEnumerable<dtoResultA> getUserStuff(int UserId)
  {
    var result = from p in contextA.userPermission.Where(x=>x.userId = UserId)
                 let b = B.getUserBenefitDetail(UserId)
                 select new dtoResultA
                 {
                   userID = c.userId,
                   permissions = p,
                   benefits = b
                 }
  }
}

这取决于你,有意义的东西,以及从目标观点来看没有意义的东西。