我一直致力于一个使用第三方DAL(SubSonic)为所有数据库对象生成类的项目。
对于查询这些对象,现有的代码实践通常是:
int keyValue = 1;
TableObject t = TableObject.SingleOrDefault(x => (x.keyField == keyValue));
if (t != null) {
int valueWeWant = t.fieldWeWant;
string otherValueWeWant = t.otherFieldWeWant;
}
我一直在尝试尽可能地减少SQL流量,因为我们往往有大行并且通常只关注一个或两个字段。到目前为止,我能找到的最佳方法是:
int keyValue = 1;
var t = TableObject.All().Where(x => (x.keyField == keyValue)).Select(x => new { x.fieldWeWant, x.otherFieldWeWant}).Take(1);
if ((t != null) && (t.Count() != 0)) {
int valueWeWant = t.First().fieldWeWant;
string otherValueWeWant = t.First().otherFieldWeWant;
}
我喜欢生成的SQL只选择一行和两个字段,并且对匿名类型的可读性感到满意,但是必须比较.Count()似乎对我来说很浪费。
我错过了一种更简单的方法来执行此操作吗?
答案 0 :(得分:3)
如果您将Take(1)
替换为SingleOrDefault()
,则需要仅检查null
,而不是Count() == 1
,并跳过First()
的来电:
var t = TableObject
.All()
.Where(x => (x.keyField == keyValue))
.Select(x => new { x.fieldWeWant, x.otherFieldWeWant})
.SingleOrDefault();
if (t != null) {
int valueWeWant = t.fieldWeWant;
string otherValueWeWant = t.otherFieldWeWant;
}
答案 1 :(得分:0)
你有正确的想法,但如果你发现yourslef使用Count()> 0,你会想要使用
if ((t != null) && (t.Any()))
.Any()在找到集合中的第一个实体后返回true。然而,.Count()在返回true之前迭代整个集合并且是性能命中