我想在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;
}
答案 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
是一种恶意类型。您无法静态定义匿名类型,因为它是匿名的。
有两种解决方案:
使用IEnumerable
作为方法的返回类型:
public IEnumerable SearchStudent(string o)
自己定义课程
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;
}
它会起作用。