我可以让我的EF对象只检索执行的sql中的特定列吗?如果我正在执行下面的代码来检索对象,那么我可以做些什么来获取某些列,如果需要的话?
public IEnumerable<T> GetBy(Expression<Func<T, bool>> exp)
{
return _ctx.CreateQuery<T>(typeof(T).Name).Where<T>(exp);
}
Run Code Online (Sandbox Code Playgroud)
这将生成包含所有列的select子句.但是,如果我有一个包含大量数据的列真的会降低查询速度,那么如何让我的对象从生成的sql中排除该列?
如果我的表有Id(int),Status(int),Data(blob),我该如何进行查询
select Id, Status from TableName
Run Code Online (Sandbox Code Playgroud)
代替
select Id, Status, Data from TableName
Run Code Online (Sandbox Code Playgroud)
根据下面的建议,我的方法是
public IEnumerable<T> GetBy(Expression<Func<T, bool>> exp, Expression<Func<T, T>> columns)
{
return Table.Where<T>(exp).Select<T, T>(columns);
}
Run Code Online (Sandbox Code Playgroud)
我这样称呼它
mgr.GetBy(f => f.Id < 10000, n => new {n.Id, n.Status});
Run Code Online (Sandbox Code Playgroud)
但是,我收到编译错误:
无法将类型'AnonymousType#1'隐式转换为'Entities.BatchRequest'
下面的代码是实现协变返回类型的唯一方法吗?
public abstract class BaseApplication<T> {
public T Employee{ get; set; }
}
public class Application : BaseApplication<ExistingEmployee> {}
public class NewApplication : BaseApplication<NewEmployee> {}
Run Code Online (Sandbox Code Playgroud)
我希望能够构造一个Application或NewApplication并让它从Employee属性返回适当的Employee类型.
var app = new Application();
var employee = app.Employee; // this should be of type ExistingEmployee
Run Code Online (Sandbox Code Playgroud)
我相信这段代码工作得很好,但是当我有几个需要相同行为的属性时,它变得非常讨厌.
有没有其他方法来实现这种行为?泛型或其他?
我需要一个对象来在我的应用程序中对象映射器.我试过了一些,但是找不到符合我需要的东西,所以我自己写的.目前我有一个如下界面:
public interface IMapper<T, R> {
T Map(R obj);
}
Run Code Online (Sandbox Code Playgroud)
然后我实现了一个AccountMapper,它将Customer映射到一个帐户:
public class AccountMapper : IMapper<Account, Customer> {
Account Map(Customer obj) {
// mapping code
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,这工作正常,但我有几个源实体映射到同一目标实体.例如,我有一个付款和一个发票都映射到BillHistory.为了支持这一点,我需要制作两个独立的映射器(即BillHistoryPaymentMapper和BillHistoryInvoiceMapper),这很好.但是,我希望能够像下面那样略微不同地实现它.唯一的问题是我不知道是否可能,如果是,我不知道正确的语法.
public interface IMapper<T> {
T Map<R>(R obj);
}
public class BillHistoryMapper : IMapper<Account> {
public BillHistory Map<Invoice>(Invoice obj) {
// mapping code
}
public BillHistory Map<Payment>(Payment obj) {
// mapping code
}
}
Run Code Online (Sandbox Code Playgroud)
虽然第一个实现工作正常,但第二个实现更优雅.这是可能的,如果是这样,正确的语法是什么样的?
编辑 - - - -
我讨厌人们这样做,但当然我忘了提一个小细节.我们在mapper和接口之间有一个抽象类,用于在所有映射器中实现一些通用逻辑.所以我的映射器签名实际上是:
public class BillHistoryMapper : Mapper<BillHistory, Invoice> {
}
Run Code Online (Sandbox Code Playgroud)
Mapper包含的地方:
public abstract class …Run Code Online (Sandbox Code Playgroud)