1

我想在 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;
}
4

6 回答 6

11

恐怕这是不可能的,因为var仅在方法范围内有效。返回类型必须是显式类型。

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

于 2013-06-18T12:45:49.960 回答
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。编译器必须做很多工作来解析类型是什么。有比实现更有价值的功能。

于 2013-06-18T12:53:36.287 回答
1

themvar关键字在编译时将被替换为实际类型,var它本身不是类型,所以你不能返回它。

在你的情况下,你正在做 a 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;
于 2013-06-18T12:46:36.703 回答
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
            };
    }
    
于 2013-06-18T12:46:55.907 回答
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;

}
于 2013-06-18T12:47:34.340 回答
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;
}

它会起作用的。

于 2013-06-18T12:52:55.977 回答