【问题标题】:What should be my return type for this function?这个函数的返回类型应该是什么?
【发布时间】:2012-09-19 21:34:18
【问题描述】:

我有以下功能:

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 它或为它创建自定义对象,因为它将被哪个类调用此方法进行过滤。

【问题讨论】:

  • 您的 EDIT 解释很难理解。方法的返回类型必须始终是某种精确类型。您不应该返回匿名类型。您能否至少提供一些您希望如何使用此方法的代码?

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


【解决方案1】:

说明

您可以创建一个代表您的方法结果的类。

示例

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

【讨论】:

  • 我需要它作为非执行格式,因为它在此方法调用后被过滤。
  • 你是什么意思?我不明白。
  • @dknaack 我认为他的意思是他想要一个IQueryable
  • Lanvinski 是对的。我对其进行了一些修改以获得我想要的东西,但它确实有效,感谢您的帮助。
  • 很高兴为您提供帮助!祝你有美好的一天!
【解决方案2】:

根据您的代码,我假设 context.Table&lt;T&gt;() 返回一个 IQueryable&lt;T&gt;,如果是这种情况,您可以这样写:

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&lt;X&gt;,其中X 是传递给MyFilter 的匿名类型。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-30
    • 1970-01-01
    • 2018-11-09
    • 2015-06-03
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多