As stated in the solution above, paging / filtering is your best option.
For filtering, allow parameters that can be passed and filter the data based on that. Look into LINQ Where / FIND for this. OData may be another good choice.
You could also allow parameters for paging. Using LINQ to returned "pages" of data. Based on the amount of data you are looking at, you may want to use both of these options. Make sure that whatever choice you make, you do it as close to the data as possible. You always want to focus on returning just the data you have to.
Sample LINQ paging:
int pageSize = 5;
var accountsByPage = (from a in svcContext.AccountSet
select new Account
{
Name = a.Name,
});
System.Console.WriteLine("Skip 10 accounts, then Take 5 accounts");
System.Console.WriteLine("======================================");
foreach (var a in accountsByPage.Skip(2 * pageSize).Take(pageSize))
{
System.Console.WriteLine(a.Name);
}
This example is from MSDN:
Page large result sets with LINQ[
^]