在LINQ中使用匿名

时间:2013-10-19 11:00:51

标签: c# linq anonymous

我正在尝试尽可能简单地完成琐碎的任务:从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。

1 个答案:

答案 0 :(得分:1)

我可以看到的问题:

  1. x.Code包装在不必要的类中。只需选择它。
  2. 您需要返回IQueryable<T>
  3. 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
            });     
    }
    

    匿名类型仅在其周围范围内可用,您无法从方法返回它们。