我对Entity Framework相当陌生,我对过滤数据有疑问。我该如何动态构建实体框架查询?
我有两个不同的日志实体,它们是:DiskLog
和NetworkLog
。这些实体都来自Log
实体。下面是从我的C#应用程序的一些代码:
public class Log { ... }
public class DiskLog : Log { ... }
public class NetworkLog : Log { ... }
public enum LogType
{
NotInitialized = 0,
Disk,
Network
}
public List<Log> GetWithFilter(
Guid userKey,
int nSkip,
int nTake,
DateTime dateFrom = DateTime.MinValue,
DateTime dateTo = DateTime.MaxValue,
LogType logType = LogType.NotInitialized,
int computerId = 0)
{
// need to know how to optimize ...
return ...
}
当然,我已经创建工作程序和数据库表。我想要做的是使函数GetWithFilter工作。我有几个执行方式有:
if logType == LogType.Disk && computerId <= 0
(这意味着没有必要使用computerId参数查询,只选择DiskLog实体)if logType == LogType.Disk && computerId > 0
(意味着我必须使用computerId参数,只选择DiskLog实体)if logType == LogType.NotInitialized && computerId <= 0
(无需使用computerId和LOGTYPE,只要选择的所有实体,DiskLog和NetworkLog)if logType == LogType.NotInitialized && computerId > 0
(选择指定的计算机的所有类型的日志)if logType == LogType.Network && computerId <= 0
(选择所有NetworkLog实体)if logType == LogType.Network && computerId > 0
(选择指定的计算机的所有NetworkLog实体)
正如你所看到的,有很多可用的选项。和我写的6个查询是这样的:
1.
context.LogSet
.OfType<DiskLog>
.Where(x => x.Computer.User.UserKey == userKey)
.Where(x => x.DateStamp >= dateFrom && x.DateStamp < dateTo)
.OrderByDescending(x => x.Id)
.Skip(nSkip)
.Take(nTake)
.ToList();
2.
context.LogSet
.OfType<DiskLog>
.Where(x => x.Computer.User.UserKey == userKey)
.Where(x => x.DateStamp >= dateFrom && x.DateStamp < dateTo)
.Where(x => x.Computer.Id == computerId)
.OrderByDescending(x => x.Id)
.Skip(nSkip)
.Take(nTake)
.ToList();
3.
context.LogSet
.Where(x => x.Computer.User.UserKey == userKey)
.Where(x => x.DateStamp >= dateFrom && x.DateStamp < dateTo)
.OrderByDescending(x => x.Id)
.Skip(nSkip)
.Take(nTake)
.ToList(); // simplest one!
4.
context.LogSet
.Where(x => x.Computer.User.UserKey == userKey)
.Where(x => x.DateStamp >= dateFrom && x.DateStamp < dateTo)
.Where(x => x.Computer.Id == computerId)
.OrderByDescending(x => x.Id)
.Skip(nSkip)
.Take(nTake)
.ToList();
5.
context.LogSet
.OfType<NetworkLog>
.Where(x => x.Computer.User.UserKey == userKey)
.Where(x => x.DateStamp >= dateFrom && x.DateStamp < dateTo)
.OrderByDescending(x => x.Id)
.Skip(nSkip)
.Take(nTake)
.ToList();
6.
context.LogSet
.OfType<NetworkLog>
.Where(x => x.Computer.User.UserKey == userKey)
.Where(x => x.DateStamp >= dateFrom && x.DateStamp < dateTo)
.Where(x => x.Computer.Id == computerId)
.OrderByDescending(x => x.Id)
.Skip(nSkip)
.Take(nTake)
.ToList();
所以,问题是如何优化代码?如何让它变得更好。
这应该是表达式。这将过滤内存中的数据。 –
Euphoric
2011-05-04 10:40:54