0

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

4

1 回答 1

1

我可以看到的问题:

  1. 你包装x.Code了一个不必要的类。只需选择它。
  2. 您将需要返回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));
}

现在当你调用它时,你必须指定一个类型

public void GetData()
{
     var data = Repository.DataQuery<Table2Type>(); 
     var result = data.Select(d => new 
        {
            Value = d.Code,
            Text = d.Name
        });     
}

匿名类型只能在其周围范围内使用,您不能从方法中返回它们。

于 2013-10-19T11:12:33.427 回答