小编Bri*_*ian的帖子

只获取特定列

我可以让我的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'

entity-framework

40
推荐指数
1
解决办法
5万
查看次数

c#使用泛型的协变返回类型

下面的代码是实现协变返回类型的唯一方法吗?

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)

我相信这段代码工作得很好,但是当我有几个需要相同行为的属性时,它变得非常讨厌.

有没有其他方法来实现这种行为?泛型或其他?

c# generics covariance

26
推荐指数
1
解决办法
6140
查看次数

基于C#泛型的对象到对象映射器问题

我需要一个对象来在我的应用程序中对象映射器.我试过了一些,但是找不到符合我需要的东西,所以我自己写的.目前我有一个如下界面:

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)

c# generics mapper

13
推荐指数
1
解决办法
9423
查看次数

标签 统计

c# ×2

generics ×2

covariance ×1

entity-framework ×1

mapper ×1