簡體   English   中英

從LINQ查詢中獲取值

[英]Get values from LINQ query

如何在下面的DoIt函數中從查詢中獲得新屬性之一的值?

public object GetData()
{
       var table = GetDataTable();
       var view = table.DefaultView;
       //..... more code
       var query = from row in view.ToTable().AsEnumerable()
                    group row by row.Field<string>("ShortName") into grouping
                    select new
                        {
                            ShortName = grouping.Key,
                            SCount = grouping.Sum( count => count.Field<int>("ProfCount")),
                            DisplayText = string.Empty
                        };
        return query;
}

// this code doesn't work
public void DoIt()
{
  var result = GetData();
  string shortName = result.ShortName;
}

謝謝!

匿名類型什么也沒有被稱為匿名類型。 所以:

用名稱定義類型(另外6行代碼):

public class Foo
{
    public string ShortName { get; set; }
    public int SCount { get; set; }
    public string DisplayText { get; set; }
}

現在,將您的GetData簽名修改為(其他0行代碼):

public IEnumerable<Foo> GetData()

並且您的LINQ查詢到(另外3個字符,或者,如果您選擇更有意義的名稱,則為另外兩個字符):

var query = 
    from row in view.ToTable().AsEnumerable()
    group row by row.Field<string>("ShortName") into grouping
    select new Foo
    {
        ShortName = grouping.Key,
        SCount = grouping.Sum( count => count.Field<int>("ProfCount")),
        DisplayText = string.Empty
    };

您將返回匿名類型(通過選擇new {}),該類型僅在本地范圍內有效。 您需要創建一個具體的類型,並從函數而不是對象中返回該類型。

public SomeClass GetData()
{
       var table = GetDataTable();
       var view = table.DefaultView;
       //..... more code
       var query = from row in view.ToTable().AsEnumerable()
                    group row by row.Field<string>("ShortName") into grouping
                    select new SomeClass
                        {
                            ShortName = grouping.Key,
                            SCount = grouping.Sum( count => count.Field<int>("ProfCount")),
                            DisplayText = string.Empty
                        };
        return query;
}

// this code doesn't work
public void DoIt()
{
  var result = GetData();
  string shortName = result.ShortName;
}

public class SomeClass
{
    public string ShortName { get; set; }
    public int SCount { get; set; }
    public string DisplayText { get; set; }
}

好吧, DoIt不知道result具有名為ShortName的屬性,因為它的類型為object 您可以創建一個具體的類來保存結果,使用反射或使用dynamic 請注意,無論哪種方式, GetData實際上都將返回IEnumerable<T> ,其中T當前是匿名類型。

使用具體的類:

public class Foo {
    public string ShortName { get; set; }
    public int SCount { get; set; }
    public string DisplayText { get; set; }
}

public IEnumerable<Foo> GetData() {
   var table = GetDataTable();
   var view = table.DefaultView;
   //..... more code
   var query = from row in view.ToTable().AsEnumerable()
                group row by row.Field<string>("ShortName") into grouping
                select new Foo
                    {
                        ShortName = grouping.Key,
                        SCount = grouping.Sum( count => count.Field<int>("ProfCount")),
                        DisplayText = string.Empty
                    };
    return query;
}

public void DoIt() {
    var result = GetData();
    foreach(var item in result) {
        Console.WriteLine(item.ShortName);
    }
}

使用反射:

public IEnumerable GetData() {
    var table = GetDataTable();
    var view = table.DefaultView;
    //..... more code
    var query = from row in view.ToTable().AsEnumerable()
                group row by row.Field<string>("ShortName") into grouping
                select new Foo
                    {
                        ShortName = grouping.Key,
                        SCount = grouping.Sum( count => count.Field<int>("ProfCount")),
                        DisplayText = string.Empty
                    };
    return query;
}

public void DoIt() {
    var result = GetData();
    PropertyInfo property = result.First().GetType().GetProperty("ShortName");
    foreach(var item in result) {
        string shortName = property.GetValue(item, null);
        Console.WriteLine(shortName);
    }
}

您不能不使用反射。 由於它是一個匿名類型,因此您也不能在DoIt()方法中將其DoIt()為該類型,因為在編譯時該類型名稱是未知的。

這給了我我需要的東西:

public object GetData()
{
       var table = GetDataTable();
       var view = table.DefaultView;
       //..... more code
            var query = from row in view.ToTable().AsEnumerable()
                    group row by row.Field<string>("ShortName") into grouping
                    select new Object[]
                        {
                            grouping.Key,
                            grouping.Sum( count => count.Field<int>("ProfCount")),
                            string.Empty 
                        };
            return query;
}


public void DoIt()
{
  // Note: Pretend that GetData returned only one result
  object[] result = GetData() as object[];
  var shortName = result[0];
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM