【问题标题】:How to return two specific columns from database using LINQ?如何使用 LINQ 从数据库中返回两个特定列?
【发布时间】:2019-12-27 12:32:12
【问题描述】:

我有一个名为 Asset 的表。它有很多列。我只想选择其中两个并单独使用它们。 这两列都是字符串。

Linq 查询:

public static List<string> GetAssetIdsWithNames()
{
    using (var db = DbManager.Get())
    {
        var result = db.Assets.SelectMany(i=> new[] { i.AssetName, i.AssetId }).Distinct().ToList();
        return result;
    }
}

我想在哪里使用它们:

            var assetList = AssetManager.GetAssetIdsWithNames();
            //CURRENCYBOX IS A DROPDOWN            
            CurrencyBox.DataSource = assetList;
            CurrencyBox.DataBind();

            foreach (var item in assetList)
            {
                CurrencyBox.DataValueField = //asset id goes here
                CurrencyBox.DataTextField =//asset name goes here


                break;
            }

【问题讨论】:

  • 有什么问题?
  • @Izzy 我得到了列表。我不能分别使用 AssetId 和 AssetName

标签: c# entity-framework linq webforms


【解决方案1】:

您不能访问本地范围之外的匿名类型。

匿名类型只能在其本地范围之外以Object 的形式返回,并通过反射检查其属性。

因此,在这种情况下,您最好使用类型化数据合约并从您的资产实体映射,然后从您的调用方法访问它。

您对SelectMany 的使用似乎也很奇怪,您可能在使用Select

public class AssetDto
{
  public string Name { get;set; }
  public string Id { get; set; }
}

public static List<AssetDto> GetAssetIdsWithNames()
{
    using (var db = DbManager.Get())
    {
        var result = db.Assets.Select(i=> new AssetDto { Name = i.AssetName, Id = i.AssetId }).ToList();
        return result;
    }
}

【讨论】:

    【解决方案2】:

    您可以为此使用命名值元组,因此您无需创建额外的类

    public static List<(string Name, int Id)> GetAssetWithIds()
    {
        using (var db = DbManager.Get())
        {
            var result = db.Assets
                .Select(a => new { a.AssetName, a.AssetId })
                .Distinct().AsEnumerable()
                .Select(a => (a.AssetName, a.AssetId))
                .ToList();
            return result;
        }
    }
    

    您需要添加System.ValueTuple

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-21
      • 2014-03-07
      • 2018-11-15
      相关资源
      最近更新 更多