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 回答