C#从函数返回var

时间:2013-06-18 12:42:59

标签: c# function return var

我想在C#中使用模块化编程。我试图用Linq查询创建一个方法。据我所知,我需要将Linq查询存储在变量中才能执行它。我创建了一个名为SearchStudent()的类和方法,但我不知道如何返回Linq查询。我该怎么办?

public var SearchStudent(string ogrenci_id)
{
    var query =
         from d in context.ogrencis
         where d.ogrenci_id ==Convert.ToInt32(ogrenci_id)
         select new
         {
             d.ogrenci_adi,
             d.ogrenci_soyadi
         };

    return query;
}

6 个答案:

答案 0 :(得分:10)

我担心这是不可能的,因为var仅在方法范围内有效。返回类型需要是显式类型。

解决方案是创建一个用于存储查询结果的类,而不是使用匿名类型。

答案 1 :(得分:4)

对于这个世界上所有小猫的爱,请你创建一个具体的类型吗?是的,它是样板,但它很简单。它会使你的解决方案比传递匿名类型的序列更加可维护(是的,这是一个选项; 不要这样做)。

class QueryResult {
    public int Orgrenci_adi { get; private set; }
    public int Orgrenci_soyadi { get; private set; }

    public QueryResult(int orgrenci_adi, int orgrenci_soyadi) {
        this.Orgrenci_adi = orgrenci_adi;
        this.Orgrenci_soyadi = orgrenci_soyadi;
    }
}

public IEnumerable<QueryResult> SearchStudent(string ogrenci_id) {
    return
        from d in context.ogrencis
        where d.ogrenci_id == Convert.ToInt32(ogrenci_id)
        select new QueryResult(d.ogrenci_adi, d.ogrenci_soyadi);
}

您根本无法使用var作为返回类型。 var对编译器说,看,你做你的事情,弄清楚类型是什么。你能想象在编译器中实现返回类型的复杂性吗?想象一下,任意长的嵌套方法链都会使用返回类型var调用每个方法。编译器必须做很多工作才能解决类型的问题。有一些功能 way 比实现它更有价值。

答案 2 :(得分:1)

在编译时,var关键字将替换为实际类型,var本身不是类型,因此您无法返回。

在您的情况下,您正在执行projection,并获得anonymous type。您无法从方法返回anonymous types。您唯一的选择是创建一个类并返回该类。

class MyClass { .. }

var query =
     from d in context.ogrencis
     where d.ogrenci_id ==Convert.ToInt32(ogrenci_id)
     select MyClass new
     {
         d.ogrenci_adi,
         d.ogrenci_soyadi
     };

    return query;

答案 3 :(得分:1)

您的类型为IEnumerable<T>,其中T是一种恶意类型。您无法静态定义匿名类型,因为它是匿名的。

有两种解决方案:

  1. 使用IEnumerable作为方法的返回类型:

    public IEnumerable SearchStudent(string o)
    
  2. 自己定义课程

    public class Result
    {
        public int Adi { get; set; }
    
        public int Soy { get; set; }
    }
    
    public IEnumerable<Result> SearchStudent(string o)
    {
        return
            from d in context.ogrencis
            where d.ogrenci_id    
            select new Result
            {
                Adi = d.ogrenci_adi,
                Soy = d.ogrenci_soyadi
            };
    }
    

答案 4 :(得分:1)

你可以使用动态,但我不确定它是个好主意。

public dynamic SearchStudent(string ogrenci_id)
{
  var query =
     from d in context.ogrencis
     where d.ogrenci_id ==Convert.ToInt32(ogrenci_id)
     select new
     {
         d.ogrenci_adi,
         d.ogrenci_soyadi
     };

    return query;

}

答案 5 :(得分:0)

在您的情况下,您必须使用以下代码

public SearchStudent(string ogrenci_id)
{
  var query =
     from d in context.ogrencis
     where d.ogrenci_id ==Convert.ToInt32(ogrenci_id)
     select new
     {
         d.ogrenci_adi,
         d.ogrenci_soyadi
     };

    return query;
}

它会起作用。