C# 实体框架将where子句追加到SqlQuery调用

C# 实体框架将where子句追加到SqlQuery调用,c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,我通过实体框架通过SqlQuery调用DbSet执行以下原始查询: public IEnumerable<TEntity> GetComplicatedData<TEntity>() { return database .Set<TEntity>() .SqlQuery("SELECT * FROM <Complicated Query Here>"); } ... var count = GetComp

我通过实体框架通过
SqlQuery
调用
DbSet
执行以下原始查询:

public IEnumerable<TEntity> GetComplicatedData<TEntity>()
{
    return database
        .Set<TEntity>()
        .SqlQuery("SELECT * FROM <Complicated Query Here>");
}

...

var count = GetComplicatedData<Item>()
    .Where(f => f.OwnerID == 5)
    .Count();

或者,有没有一种方法可以将where表达式转换为可以手动追加的查询(也就是说,不必手动编写SQL查询,where子句并不总是那么简单)

这不能用LINQ方法来完成,因为“原始”查询是一种类型,它不支持使用
Where
来“组合”动态查询

如果您对物品计数感兴趣,您可以通过以下条件解决此问题:

public int CountComplicatedData<TEntity>(Func<TEntity,bool> condition) {
    return database
        .Set<TEntity>()
        .SqlQuery("SELECT * FROM <Complicated Query Here>")
        .Count(condition);
}
public int countddata(Func条件){
返回数据库
.Set()
.SqlQuery(“选择*自”)
.计数(条件);
}

如果
getcomplementddata
是一个
void
方法,该方法如何工作?是什么阻止你将复杂的查询转换为Linq?@juharr Woops,对不起,我正在为这个问题编写伪代码,因为实际代码太长了。我无法将代码转换为LINQ,它在不属于数据模型的表上执行。下一个问题:为什么该表不是数据模型的一部分?@juharr这正是我必须处理的问题。为了在某个时间点模拟表,我做了大量的工作。我能想到的最接近EF支持类似功能的事情是实现
IDbCommandInterceptor
,但是要正确地做到这一点需要做一些工作,特别是如果您希望使用的查询文本是动态/可配置的。我恐怕情况就是这样
Count
只是一个例子,应用程序以多种方式使用结果,即使如此,它仍然会在本地运行条件,这正是我试图避免的。您知道是否有办法将条件转换为原始SQL查询吗?我在EF中找不到任何允许我翻译成真正SQL的开放API。@不幸的是,我不知道有任何这样的实现。当我的项目需要使用类似的功能时,我推出了自己的实现。通过扩展
ExpressionVisitor
,我成功地在不到300行代码中打包了许多功能。不幸的是,我的项目是封闭源代码的,因此我无法共享其中的任何代码。显然,另一种方法是参数化SQL查询,但我假设您已经考虑过这样做,并认为它太复杂而不予考虑。是的,我希望我可以“注入”我自己的表取代了它默认查询的表,不会对性能造成太大影响。这样我就可以利用表达式进行查询。谢谢你的信息!我必须投入比我希望的更多的工作哈哈。
public int CountComplicatedData<TEntity>(Func<TEntity,bool> condition) {
    return database
        .Set<TEntity>()
        .SqlQuery("SELECT * FROM <Complicated Query Here>")
        .Count(condition);
}