【问题标题】:How do I pass function delegates to be called with LINQ? [closed]如何传递要使用 LINQ 调用的函数委托? [关闭]
【发布时间】:2011-07-19 13:19:06
【问题描述】:

我想我在这里问的问题是正确的......

我有 4 个存储过程,它们返回相同数据的不同子集。

我将此数据映射到我的服务器应用程序中的同一对象。

我的代码设置如下:

internal static MyDataContext dc = new MyDataContext();

internal static List<MyObj> getData(DataType data)
{
    List<MyObj> obj = null;
    switch (data) 
    {
        case DataType.Type1:
            obj = mapObj(dc.getDataType1);
            break;
        case DateType.Type2:
            obj = mapObj(dc.getDataType2);
            break;
        ...
    }
}

// This gives me an error that type T cannot be defined
// private static List<MyObj> mapObj(Func<T> getDataForObj)
// This gives me an error calling the function (Cannot find implementation of query pattern for source type T
private static List<MyObj> mapObj<T>(Func<T> getDataForObj)
{
    List<MyObj> obj = new List<MyObj>();

    var result = from a in getDataForObj()
                 select a;

    foreach (var row in result)
    {
        ... // map objs 
    }    

    return obj;
}

有关我遇到的问题的方法声明,请参阅我的 cmets。我将如何正确地做到这一点?我的目标是不要多次复制/粘贴相同的代码……尝试遵循 DRY 原则。提前感谢您的帮助。

【问题讨论】:

  • 您还没有显示delegateForType1delegateForType2 是什么。
  • @Jon Skeet:它们都是使用 linq2sql 类对存储过程的调用。 DataContext.StoredProcedure1();所以他们返回IEnumerable&lt;StoredProcResult&gt;
  • 但是它们在编译时是什么类型?我怀疑您只需要在您的mapObj 方法中将Func&lt;T&gt; 更改为Func&lt;IEnumerable&lt;T&gt;&gt;,但是如果没有更多信息就很难确定。演示问题的简短但完整程序将非常有帮助。
  • 添加 Func> 帮助...现在我的映射中的字段没有解析,因为 T 没有定义它们...嗯,新问题,我想。

标签: c# linq generics .net-4.0 delegates


【解决方案1】:

使我的 mapObj 函数如下(根据 @Jon Skeet 在 cmets 中的建议)允许它编译和运行:

private static List<MyObj> mapObj<T>(Func<IEnumerable<T>> getDataForObj)
{
    List<MyObj> obj = new List<MyObj>();

    var result = from a in getDataForObj()
                 select a;

    foreach (var row in result)
    {
        ... // map objs 
    }    

    return obj;
}

这导致了一个关于字段映射的新问题,但我将在一个新问题中提出这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    • 2020-08-26
    • 2013-11-17
    • 1970-01-01
    • 2019-09-20
    • 2021-05-31
    相关资源
    最近更新 更多