我正在尝试尽可能简单地完成琐碎的任务:从 table1 中获取不同的代码集,并根据代码字段过滤掉 table2 中的所有记录。我想利用 LINQ 和匿名类型的好处,因为它将是优雅和干净的代码,并且我试图避免制作中间传输类。代码可能类似于:
//In db repository
public static IQueryable DataQuery()
{
var args = db.Table1.Select(x => new { x.Code }).Distinct();
return db.Table2.Where(r => args.Contains(r.Code));
// Contains extension not allow use args implicitly!
}
并调用方法:
public void GetData()
{
var data = Repository.DataQuery();
var result = data.Select(d => new
{
Value = d.Code,
Text = d.Name
});
// the same problem here, Select wants only explicitly specified args!
}
如何以正确的方式和尽可能清洁的方式完成?主要是,示例代码有两个问题:在同一方法中将匿名作为参数并将其返回到另一个方法/项目。那么如果我不能使用匿名有什么用呢?在所有教程中,我看到匿名被用作 Console.WriteLine(...) 当然它会起作用,但在现实生活中我想要更多将其显示在屏幕上。
当我想从更大的表中过滤掉不同的实体子集时,这是创建新类的唯一方法吗?
已知限制:
匿名只能在周围范围内使用;
动态仅在同一组件中有用;
编辑示例:
public IQueryable DataQuery()
{
return dbContext.MyModel.Select(x => new { x.Code, x.Name }).Distinct();
}
我只想为 MyModel 中的一些感兴趣的属性返回 Iqueryable 或 ienumerable。