C# 如何使用LINQ从数据库返回两个特定列?

C# 如何使用LINQ从数据库返回两个特定列?,c#,entity-framework,linq,webforms,C#,Entity Framework,Linq,Webforms,我有一张叫做资产的桌子。它有很多列。我只想选择其中两个并分别使用它们。 这两列都是字符串 Linq查询: public static List<string> GetAssetIdsWithNames() { using (var db = DbManager.Get()) { var result = db.Assets.SelectMany(i=> new[] { i.AssetName, i.AssetId }).Distinct().To

我有一张叫做资产的桌子。它有很多列。我只想选择其中两个并分别使用它们。 这两列都是字符串

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;
    }
}

您无法访问本地范围之外的匿名类型

匿名类型只能作为本地范围之外的对象返回,并且只能通过反射检查其属性

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

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


您可以为此使用命名值元组,这样就不需要创建额外的类

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

有什么问题吗?@Izzy我得到列表。我不能单独使用AssetId和AssetName
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;
    }
}
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;
    }
}