0

A.csproj と B.csproj という 2 つのデータ アクセス クラス ライブラリがあります。それぞれにedmxがあります。2 つの edmx には、2 つの異なるデータベースからのエンティティが含まれています。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
                 }
  }
}
4

2 に答える 2

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
                 }
  }
}

オブジェクト指向の観点から、何が理にかなっていて、何が理にかなっていないかはあなた次第です。

于 2013-10-17T15:21:33.040 に答える
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)
                 }
  }
}
于 2013-10-17T06:53:37.713 に答える