我正在尝试尽可能简单地完成琐碎的任务:从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!
}
如何以正确的方式做到尽可能清洁? 主要是,示例代码有两个问题:在同一方法中将匿名作为args并将其返回到另一个方法/项目。那么如果我不能使用匿名用户?在所有教程中,我看到匿名被用作Console.WriteLine(...)当然它会起作用但在现实生活中我想要更多将它放在屏幕上。
当我想从较大的表中筛选出不同的实体子集时,它是否只能创建新类?
已知限制:
匿名只能在周围范围内使用;
dynamic仅在同一个程序集中有用;
编辑示例:
public IQueryable DataQuery()
{
return dbContext.MyModel.Select(x => new { x.Code, x.Name }).Distinct();
}
我想仅为MyModel中的一些感兴趣的属性返回Iqueryable或ienumerable。
答案 0 :(得分:1)
我可以看到的问题:
x.Code
包装在不必要的类中。只需选择它。 IQueryable<T>
public static IQueryable<T> DataQuery()
{
//var args = db.Table1.Select(x => new { x.Code }).Distinct();
var args = db.Table1.Select(x => x.Code ).Distinct();
return db.Table2.Where(r => args.Contains(r.Code));
}
现在当你调用它时,你必须指定一个Type
public void GetData()
{
var data = Repository.DataQuery<Table2Type>();
var result = data.Select(d => new
{
Value = d.Code,
Text = d.Name
});
}
匿名类型仅在其周围范围内可用,您无法从方法返回它们。