1

我一直在从事一个使用第三方 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 只选择单行和 2 个字段,并且对匿名类型的可读性感到满意,但必须比较 .Count() 对我来说似乎很浪费。

我是否错过了一种更简单的方法来执行此操作?

4

2 回答 2

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;
}
于 2012-11-09T20:06:38.133 回答
0

你有正确的想法,但如果你发现你自己使用 Count() > 0,你会想要使用

if ((t != null) && (t.Any())) 

.Any() 在找到集合中的第一个实体后返回 true。而 .Count() 会在返回 true 之前迭代整个集合,并且会影响性​​能

于 2012-11-09T20:04:49.923 回答