从EF模型中的所有表中获取10行

时间:2016-04-20 07:39:09

标签: c# entity-framework linqpad

我从here找到了这个样本:

NWDataContext context = new NWDataContext();

var model = context.Mapping;

//get all tables 
foreach (var mt in model.GetTables())
{
    Console.WriteLine("Getting data " + mt.TableName);

    //generate a sql statment for each table - just grab the first 20
    string sql = String.Format("Select Top 20 * from {0} ", mt.TableName);
    var data = context.ExecuteQuery(mt.RowType.Type, sql);

    //data is here now. Lets print it on the console
    foreach (var item in data)
    {
        Console.WriteLine(item.ToString());
    }
}
Console.ReadLine();

有没有办法在不使用Sql字符串的情况下获得10行?

例如类似的东西(它获取表关联,我在10(N)行表数据后而不是表关联):

var tableData = from t in this.Mapping.GetTables()
                select new 
                {
                    t.TableName,
                    Associations = 
                        from a in t.RowType.Associations
                        select new
                    {
                        a.ThisMember.Name,
                        TypeName = a.ThisMember.Type.Name
                    }
                };
tableData.Dump();

2 个答案:

答案 0 :(得分:1)

为此,您需要在类型:

上调用context.GetTable
from metaTable in context.Mapping.GetTables()
let table = (IQueryable<object>) context.GetTable (metaTable.RowType.Type)
select table.Take(10)

请记住,您的示例与LINQ to SQL相关,而不是EF(如标题所示)。

答案 1 :(得分:-1)

当您从数据库获取数据时,EntityFramework将返回IEnumerables。这意味着除非你通过它枚举(比如获取计数,ToList()等,实际上是延迟加载)数据将不会从数据库中获取。

所以这是一个例子,

var database = new SomeDatabase(connectionString);
var tableRows = database.Context.SomeTableName;
var result = new List<SomeDataType>();
var count = 0;
foreach (var tableRow in tableRows)
{

    result.Add(tableRow);
    count++;
    if (count == 10) break;
}

或者

var result = database.ContextSomeTableName.Take(10).ToList();

在此示例中,将仅从数据库中提取10条记录。 但如果你这样做,

var tableRows = database.Context.SomeTableName.ToList();

您将从该表中获取整行(注意ToList()),