gpt4 book ai didi

c# - SQL to Linq语句中的独立子查询(只命中一次DB)

转载 作者:太空狗 更新时间:2023-10-30 01:05:44 24 4
gpt4 key购买 nike

有类似的东西:

 SELECT (SELECT COUNT(*) from Table1),(SELECT COUNT(*) from Table2 )

在linq中怎么写?还是简单的不可能?

限制:

  • 只能访问一次数据库:

       var result = new {
    Sum1 = db.Table1.Count(),
    Sum2 = db.Table2.Count()
    }); // is not valid.....
  • 我不想使用类似于(使用“帮助”表)的东西:

    var result = (from t3 in db.Table3
    select new {
    Sum1 = db.Table1.Count(),
    Sum2 = db.Table2.Count()
    }).firstOrDefault();
    //In order to get only the first row
    //but it will not return nothing if the table 3 has no entries......
  • 不使用 db.Database.ExecuteSqlCommand

最佳答案

我看不到解决您所有限制的解决方案。这是使用 ORM 映射器的注意事项之一,您无法控制生成的 SQL。

在这种情况下,如果您完全不能接受向数据库发送多个查询,那么严酷的事实是您将不得不自己编写查询。

更新

我很好奇并创建了一个可以执行此操作的扩展方法!当然它构造了自己的 SQL 命令,它只适用于 Linq2SQL。还有大量免责声明:这是相当脏的代码,如果我有时间的话,我会在周末修复它:)

public static TOut CountMany<TContext, TOut>(this TContext db, Expression<Func<TContext, TOut>> tableSelector)
where TContext: DataContext
{
var newExpression = (NewExpression) tableSelector.Body;
var tables =
newExpression.Arguments.OfType<MethodCallExpression>()
.SelectMany(mce => mce.Arguments.OfType<MemberExpression>())
.ToList();
var command = new string[tables.Count];
for(var i = 0; i < tables.Count; i++)
{
var table = tables[i];
var tableType = ((PropertyInfo) table.Member).PropertyType.GetGenericArguments()[0];
var tableName = tableType.GetCustomAttribute<TableAttribute>().Name;
command[i] = string.Format("(SELECT COUNT(*) FROM {0}) AS T{1}", tableName, i);
}

var dbCommand = db.Connection.CreateCommand();
dbCommand.CommandText = string.Format("SELECT {0}", String.Join(",", command));
db.Connection.Open();
IDataRecord result;
try
{
result = dbCommand.ExecuteReader().OfType<IDataRecord>().First();
}
finally
{
db.Connection.Close();
}

var results = new object[tables.Count];
for (var i = 0; i < tables.Count; i++)
results[i] = result.GetInt32(i);
var ctor = typeof(TOut).GetConstructor(Enumerable.Repeat(typeof(int), tables.Count).ToArray());
return (TOut) ctor.Invoke(results);
}

代码是这样调用的:

var counts = dbContext.CountMany(db => new 
{
table1Count = db.Table1.Count(),
table2Count = db.Table2.Count()
//etc.
});

关于c# - SQL to Linq语句中的独立子查询(只命中一次DB),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17592338/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com