Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Linq返回包含列的结果集_Linq_Linq To Entities_Intellisense - Fatal编程技术网

如何使用Linq返回包含列的结果集

如何使用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

我在一个类中有一个函数,它将运行Linq到实体查询(实际上是任何类型的Linq查询),它将在结果集中返回2列。我想向调用我的函数的人返回一个对象,该对象将允许Intellisense知道我返回的内容。
让我解释一下。如果我有这样一个函数:

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项目)