Select Linq中的ValueTuple

jv2fixgn  于 2023-04-09  发布在  其他
关注(0)|答案(2)|浏览(141)

日安,我有一个问题,我需要从查询中拉出几个值

var val= context.tab1.Select(x=> new {x.a,x.b,x.c})

但是变量“瓦尔”将具有匿名类型,因此我无法完成我的任务。我的下一个想法是获取变量并将其放入Tuple中,但这并不舒服,因为我无法在Select状态下命名Tuple中的值

var val1= context.tab1.Select(x => Tuple.Create(x.a, x.b, x.c)

在所有这些之后,我有一个问题是如何将linq Select中的值放入ValueTuple中?

var val2= context.tab1.Select(x => (int,int,DateTime) (x.a, x.b, x.c))

抱歉我的英语不好,谢谢

var val= context.tab1.Select(x=> new {x.a,x.b,x.c})
var val1= context.tab1.Select(x => Tuple.Create(x.a, x.b, x.c)
var val2= context.tab1.Select(x => (int,int,DateTime) (x.a, x.b, x.c))
q8l4jmvw

q8l4jmvw1#

基于你引用context的代码示例,我假设你正在谈论一些ORM,比如Entity Framework,它不仅使用“简单的”LINQ-to-Objects,而且基于使用expression treesIQueryable接口的组合来执行SQL生成。
如果是-则否,目前不可能通过“标准”语法创建值元组,因为不可能在表达式树中使用值元组字面量。您可以在github上监视以下问题/讨论:

如果你真的想这样做,你可以把IQueryable转换为IEnumerable,并把select转换为一个值元组:

var result = (await _context.tab1
   .Select(x => new {x.a, x.b})
   .ToListAsync())
   .Select(ac => (ac.a, ac.a))
   .ToList();

或者

var result = _context.tab1
   .Select(x => new {x.a, x.b})
   .AsEnumerable()
   .Select(ac => (ac.a, ac.a))
   .ToList();

或者通过@iman safari建议的方法间接。
但我认为这在任何情况下都有点无意义,因为用records创建一个新类型在现代. NET中非常容易,所以只需创建一个类型并使用它。
另请阅读:

z5btuh9x

z5btuh9x2#

尝试添加如下方法:

static (int a, int b, DateTime c) GetValueTuple(int i1, int i2, DateTime dt) 
     => (i1, i2, dt);

你可以任意改变t1...tn。

var val2 = context.tab1.Select(x => GetValuTuple(x.a, x.b, x.c));

您可以使用First()来确保它正常工作。

var val3 = val2.First();

相关问题