0

私は次の機能を持っています:

public void Test(IDataContext context)
{
        return (From c In context.Table<DalLinq.Claim>()
                Join cli In context.Table<DalLinq.ClaimLineItem>() On cli.ClaimId Equals c.ClaimId
                Join ri In context.Table<DalLinq.ReceiptItem>() On ri.ReceiptItemId Equals cli.ReceiptItemId
                Join r In context.Table<DalLinq.Receipt>() On r.ReceiptId Equals ri.ReceiptId
                Select c, cli, ri, r)
}

以前はこれを関数の変数として持っていましたが、今は複数の場所で必要なので、これを関数に配置していますが、戻り値の型がどうあるべきかわかりません。例では void を示していますが、それは何を入れればよいかわからないためです。

return ステートメントの次の / 作業コードを考えると、この戻り値の型はどうあるべきですか?

ありがとう!

編集

非実行形式として必要なので、このメソッドを呼び出しているクラスによってフィルタリングされるため、ToList したり、カスタム オブジェクトを作成したりすることはできません。

4

2 に答える 2

2

説明

メソッドの結果を表すクラスを作成できます。

サンプル

public class MyReturnClass 
{
    DalLinq.Claim Claim { get; set; }
    DalLinq.ClaimLineItem ClaimLineItem { get; set; }
    DalLinq.ReceiptItem ReceiptItem { get; set; }
    DalLinq.Receipt Receipt { get; set; }
}

public MyReturnClass Test(IDataContext context)
{
        return (From c In context.Table<DalLinq.Claim>()
                Join cli In context.Table<DalLinq.ClaimLineItem>() On cli.ClaimId Equals c.ClaimId
                Join ri In context.Table<DalLinq.ReceiptItem>() On ri.ReceiptItemId Equals cli.ReceiptItemId
                Join r In context.Table<DalLinq.Receipt>() On r.ReceiptId Equals ri.ReceiptId
                Select new MyReturnClass { Claim = c, ClaimLineItem = cli, ReceiptItem = ri, Receipt = r }).First();
}
于 2012-09-19T21:41:15.840 に答える
1

あなたのコードから、 をcontext.Table<T>()返すと仮定します。IQueryable<T>その場合は、次のように書くことができます。

public static class IDataContextExtensions
{
    public static IQueryable<T> MyFilter<T>(this IDataContext context, Func<Claim, ClaimLineItem, ReceiptItem, Receipt, T> resultor)
    {
        return from c fn context.Table<DalLinq.Claim>()
            join cli in context.Table<DalLinq.ClaimLineItem>() on cli.ClaimId equals c.ClaimId
            join ri in context.Table<DalLinq.ReceiptItem>() on ri.ReceiptItemId equals cli.ReceiptItemId
            join r in context.Table<DalLinq.Receipt>() on r.ReceiptId equals ri.ReceiptId
            select resultor(c, cli, ri, r);
    }  
}   

この方法では「dto」クラスは必要なく、このメソッドを次のように呼び出します。

var data = myContext.MyFilter((c, cli, ri, r) => new 
                                                 { 
                                                     Claim = c, 
                                                     ClaimLineItem = cli, 
                                                     ReceiptItem = ri, 
                                                     Receipt = r 
                                                 }).ToList();

結果は になりますIEnumerable<X>。ここで、Xは に渡される匿名型MyFilterです。

免責事項: テストされていないコードであり、アイデアを示しているだけです。

于 2012-09-20T07:10:25.220 に答える