该函数的返回类型应该是什么?

时间:2012-09-19 21:34:19

标签: visual-studio-2010 linq c#-4.0 types lambda

我有以下功能:

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

我以前把它作为函数中的一个变量,但我现在需要它在多个地方,所以我把它放在一个函数中,但我不知道我的返回类型应该是什么。在示例中,它显示无效,但这是因为我不知道要放什么。

在return语句中给出以下/工作代码,这个返回类型应该是什么?

谢谢!

修改

我需要它作为一种非执行格式,所以我不能为它定位或为它创建自定义对象,因为它将被调用此方法的类进行过滤。

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分: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的匿名类型。

免责声明:未经测试的代码,只是展示了一个想法。