如何使用Linq返回包含列的结果集
我在一个类中有一个函数,它将运行Linq到实体查询(实际上是任何类型的Linq查询),它将在结果集中返回2列。我想向调用我的函数的人返回一个对象,该对象将允许Intellisense知道我返回的内容。如何使用Linq返回包含列的结果集,linq,linq-to-entities,intellisense,Linq,Linq To Entities,Intellisense,我在一个类中有一个函数,它将运行Linq到实体查询(实际上是任何类型的Linq查询),它将在结果集中返回2列。我想向调用我的函数的人返回一个对象,该对象将允许Intellisense知道我返回的内容。 让我解释一下。如果我有这样一个函数: public static IQueryable GetInfo(MyEntityModel oEntityModel) { var query = (from t in oEntityModel.Table1 from u in t.T
让我解释一下。如果我有这样一个函数:
public static IQueryable GetInfo(MyEntityModel oEntityModel)
{
var query =
(from t in oEntityModel.Table1
from u in t.Table2
where t.Status == true &&
u.Status == true
select new
{
t.Column1,
u.Column2
})
return query;
}
我可以(应该)放置什么来代替IQueryable,这样无论谁调用我的GetInfo函数,都可以从resultset获得Intellisense,并显示它有一个Column1和Column2
var linqresult = ClsLinqTeste.GetInfo(oEntityModel);
if (linqresult.Column1 == 1)
{
foreach (var oItem in linqresult)
{
.. do stuff...
}
}
Tks当您以可查询的方式返回结果集时,应用程序已经能够为您提供intellisense,但是在您的示例中,您必须指定其中一项。如果您知道您的集合只有一行,则必须指定FirstOrDefault,或者迭代您的集合以从中获取项目,如下所示: 这就是你正在做的:
var linqresult = ClsLinqTeste.GetInfo(oEntityModel);
if (linqresult.Column1 == 1)
{
..do stuff...
}
这是你应该做的:
var linqresult = ClsLinqTeste.GetInfo(oEntityModel);
foreach(var item in linqresult)
{
if (item.Column1 == 1)
{
..do stuff...
}
}
您必须迭代linqresult,因为当您使用link进行查询时,它会返回一个结果集,即使它只有一列。与任何集合一样,您的数据列在整个结果集中都不可用,仅在单个项目中可用。当您以可查询的方式返回结果集时,应用程序已经能够为您提供intellisense,但是在您的示例中,您必须指定其中一个。FirstOrDefault如果您知道您的集合将只有一行,或者遍历集合以从中获取项目,如下所示: 这就是你正在做的:
var linqresult = ClsLinqTeste.GetInfo(oEntityModel);
if (linqresult.Column1 == 1)
{
..do stuff...
}
这是你应该做的:
var linqresult = ClsLinqTeste.GetInfo(oEntityModel);
foreach(var item in linqresult)
{
if (item.Column1 == 1)
{
..do stuff...
}
}
您必须迭代linqresult,因为当您使用link进行查询时,它会返回一个结果集,即使它只有一列。与任何集合一样,您的数据列在整个结果集中都不可用,仅在单个项上可用。您不能从函数返回匿名类型,它们是严格的“内联”类。当您返回它时,foreach循环将只能将结果解释为普通对象。我想您可以使用反射来查询属性名称和值,但是定义数据传输类型来保存结果似乎更简单 看这个,还有这个 因此,您可以创建一个简单的结构或类:
public class MyDataResult
{
public object Column1 { get; set; }
public object Column2 { get; set; }
}
然后在函数中修改查询:
public static IQueryable<MyDataResult> GetInfo(MyEntityModel oEntityModel)
{
var query =
(from t in oEntityModel.Table1
from u in t.Table2
where t.Status == true &&
u.Status == true
select new MyDataResult
{
Column1 = t.Column1,
Column2 = u.Column2
})
return query;
}
公共静态IQueryable GetInfo(MyEntityModel oEntityModel)
{
变量查询=
(来自oEntityModel.Table1中的t)
来自t.2表中的u
其中t.Status==true&&
u、 状态==真
选择新的MyDataResult
{
Column1=t.Column1,
第2列=u.Column2
})
返回查询;
}
这样的办法应该行得通。注意,我在MyDataResult中使用了“object”作为属性。我不知道您要返回的列的类型,您应该使用实际类型以获得完整的intellisense。您不能从函数返回匿名类型,它们是严格的“内联”类。当您返回它时,foreach循环将只能将结果解释为普通对象。我想您可以使用反射来查询属性名称和值,但是定义数据传输类型来保存结果似乎更简单 看这个,还有这个 因此,您可以创建一个简单的结构或类:
public class MyDataResult
{
public object Column1 { get; set; }
public object Column2 { get; set; }
}
然后在函数中修改查询:
public static IQueryable<MyDataResult> GetInfo(MyEntityModel oEntityModel)
{
var query =
(from t in oEntityModel.Table1
from u in t.Table2
where t.Status == true &&
u.Status == true
select new MyDataResult
{
Column1 = t.Column1,
Column2 = u.Column2
})
return query;
}
公共静态IQueryable GetInfo(MyEntityModel oEntityModel)
{
变量查询=
(来自oEntityModel.Table1中的t)
来自t.2表中的u
其中t.Status==true&&
u、 状态==真
选择新的MyDataResult
{
Column1=t.Column1,
第2列=u.Column2
})
返回查询;
}
这样的办法应该行得通。注意,我在MyDataResult中使用了“object”作为属性。我不知道您返回的列的类型,您应该使用实际类型以获得完整的intellisense。您返回的是匿名类型的集合,它们将被强制转换为对象,因此当您尝试对它们进行迭代时,尽管它们将是您的对象(并且它们将包含您的属性)在编译时,它们将被强制转换为对象: foreach (var x in ClsLinqTeste.GetInfo(oEntityModel)) { //x is an Object } foreach(ClsLinqTeste.GetInfo(oEntityModel)中的变量x) { //x是一个对象 } 你可以阅读更多关于它的内容
如果您想要intellisense,我建议您创建一个自定义类,它们将保存您的属性,并且返回的不是匿名类型(使用
new{}
),而是您的类的对象(newMyClass(prop1,prop2)
)。您还需要更改方法的签名,以便它返回IQueryable
,而不仅仅是普通的非泛型IQueryable您返回的是匿名类型的集合,它们将被强制转换为对象,因此当您尝试对它们进行迭代时,尽管它们将是您的对象(并且它们将包含您的属性)在编译时,它们将被强制转换为对象:
foreach (var x in ClsLinqTeste.GetInfo(oEntityModel))
{
//x is an Object
}
foreach(ClsLinqTeste.GetInfo(oEntityModel)中的变量x)
{
//x是一个对象
}
你可以阅读更多关于它的内容
如果您想要intellisense,我建议您创建一个自定义类,它们将保存您的属性,并且返回的不是匿名类型(使用new{}
),而是您的类的对象(newMyClass(prop1,prop2)
)。您还需要更改方法的签名,以便它返回IQueryable
,而不仅仅是普通的非泛型IQueryable
,如果您希望强类型枚举非泛型IEnumerable(IEnumerable.GetEnumerator()
而不是IEnumerable.GetEnumerator()
),则可以使用Cast()扩展,像这样
var myquery = GetQueryable();
for (var item in myquery.Cast<MyDataType>())
{
// use item.Column1 directly and strongly typed with intellisense
}
var myquery=GetQueryable();
for(myquery.Cast()中的var项)
{
//直接使用item.Column1并使用intellisense强类型
}
如果要强类型枚举非泛型IEnumerable(IEnumerable.GetEnumerator()
而不是IEnumerable.GetEnumerator()
),可以使用Cast()扩展,如下所示
var myquery = GetQueryable();
for (var item in myquery.Cast<MyDataType>())
{
// use item.Column1 directly and strongly typed with intellisense
}
var myquery=GetQueryable();
对于(myque中的var项目)