Yield return database records using LinqToSql?

后端 未结 3 2029
长发绾君心
长发绾君心 2021-01-01 03:17

I have a supplying method in DAL:

public IEnumerable GetRecords()
{
    using (LinqDataContext context = new LinqDataContext())
    {
              


        
3条回答
  •  醉梦人生
    2021-01-01 03:44

    In the case of executing a basic query, it can work that way (certainly it is possible) - however, in the case of querying a naked Table, it might be that it all buffers first; you could perhaps try querying the count during the iteration, or running a trace. In this case I suspect it will buffer first.

    Re closed: that also depends ;p If someone is using foreach, then yes: since foreach explicitly disposes the iterator via finally. However! It is not guaranteed if someone does, for example (very naughty and lax):

    var iter = yourData.GetEnumerator();
    if(iter.MoveNext()) {
        Console.WriteLine(iter.Current.Name); // first record of, say, 20
    }
    // and don't dispose the iterator == bad
    

    then since the iterator doesn't a: get disposed, b: exhaust itself, and c: doesn't crash, it won't shut down properly (any of those 3 conditions will close it properly). Emphasis: this is a pathological case: normally it is reasonably safe to say "it will close, yes".

    If you want guaranteed non-buffering, note that "dapper" has that, if you set buffered to false:

    IEnumerable customers = connection.Query(
           "select * from Customer", buffered: false);
    

    (it can also handle the parameters etc)

提交回复
热议问题