使用LINQ查询和Lambda表达式选择多个列

21

我是C# ASP.NET的新手,正在开发我的第一个应用程序。

我在尝试创建一个能够返回数组的Linq语句。

我有一个产品表,我想能够选择每个产品的名称、ID和价格,其中状态等于1。

我正在努力创建一种方法来完成这个任务。 我只能够返回单个项目/列。 我已经被困在这里很长时间了。

这是我目前为止的代码:

try
{
  using (UserDataDataContext db = new UserDataDataContext())
  {
    return db.mrobProducts.Select(x => x.Name).OrderBy(x => x).ToArray();
  }
}

如果您查看下面的屏幕截图,您可以看到我有两个错误, Select = Type对象不能从其使用中引用 ToArray = 无法将符号解析为数组

我无法添加where子句,无论我在哪里或如何添加它,都会创建错误。 - Mark
返回一个二维数组。 - Farhad Jabiyev
@GrantWinney,我已经更新了问题,因为我已经实现了每个人的答案,但仍然在这里遇到问题。 - Mark
1
string[] 更改为 Tuple<int, string, string> - Farhad Jabiyev
4个回答

32

不确定您的表结构是什么样子,但请参见下文。

public NamePriceModel[] AllProducts()
{
    try
    {
        using (UserDataDataContext db = new UserDataDataContext())
        {
            return db.mrobProducts
                .Where(x => x.Status == 1)
                .Select(x => new NamePriceModel { 
                    Name = x.Name, 
                    Id = x.Id, 
                    Price = x.Price
                })
                .OrderBy(x => x.Id)
                .ToArray();
         }
     }
     catch
     {
         return null;
     }
 }

这将返回一个类型为匿名的数组,其中包含所需的成员。

更新:

创建一个新类。

public class NamePriceModel 
{
    public string Name {get; set;}
    public decimal? Price {get; set;}
    public int Id {get; set;}
}

我已经修改了上面的查询,使其返回这个结果,并且你应该将方法从返回 string[] 改为返回 NamePriceModel[]


返回获取了一个错误,提示无法将表达式类型Namstring、Pricestring转换为返回类型string[]。 - Mark
@Mark,我不确定你对于你所寻找的解决方案是否选择了正确的返回类型。如果你并不关心为其创建一个类型,可以考虑返回dynamic。不过,返回一个类型会提供更清晰明确的信息。 - scartag
@scaretag,你能否根据我更新的问题提供一个示例呢? - Mark
@Mark 我已经做过了。我已经在我的答案中更新了一个例子。 - scartag
@scartag 你不会相信,但他又问了一个关于这个错误的新问题。 :) 在这里 - Farhad Jabiyev
显示剩余2条评论

12

您可以使用:

public YourClass[] AllProducts()
{
    try
    {
        using (UserDataDataContext db = new UserDataDataContext())
        {
            return db.mrobProducts.Where(x => x.Status == 1)
                           .OrderBy(x => x.ID)
                           .Select(x => new YourClass { ID = x.ID, Name = x.Name, Price = x.Price})
                           .ToArray();
        }
    }
    catch
    {
        return null;
    }
}

以下是YourClass的实现:

public class YourClass
{
  public string Name {get; set;}
  public int ID {get; set;}
  public int Price {get; set;}
}

你的AllProducts方法的返回类型必须是YourClass[]


感谢您的回答。对我很有帮助。查询已经优化。 - Prince

7
使用LINQ和Lambda表达式,我想要返回两个字段值并将它们赋值给单一实体对象字段;
例如:Name = Fname + " " + LName;
以下是我的代码,它能够正常工作;希望这对你有用;
Myentity objMyEntity = new Myentity
{
id = obj.Id,
Name = contxt.Vendors.Where(v => v.PQS_ID == obj.Id).Select(v=> new { contact = v.Fname + " " + v.LName}).Single().contact
}

无需声明“contact”


2
        Object AccountObject = _dbContext.Accounts
                                   .Join(_dbContext.Users, acc => acc.AccountId, usr => usr.AccountId, (acc, usr) => new { acc, usr })
                                   .Where(x => x.usr.EmailAddress == key1)
                                   .Where(x => x.usr.Hash == key2)
                                   .Select(x => new { AccountId = x.acc.AccountId, Name = x.acc.Name })
                                   .SingleOrDefault();

1
请问您能详细说明一下您所提出的代码吗? - mrk
这里,账户表和用户表通过AccountId外键连接。where条件应用于用户表列。我们从账户表中选择了两个列。 - Varun Tej Reddy Putchakayala

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接