我得到了一个巨大的LINQ语句,其中包含多个条件的多个连接。我需要在其中一个连接中使用数据库函数(DatePart,DiffDays)。我使用Moq进行单元测试。由于这些DBFunction只能通过静态方法调用,所以我无法模拟这些方法。如果我通过SqlFunctions或EntityFunctions调用它们,我会得到一个NotSupportedException(“这个函数只能从LINQ to Entities调用。”),但是我的应用程序工作正常。如果我使用System.Data.Entity.DbFunction它也适用于我的应用程序,但不适用于我的单元测试。
我缩短了LINQ-Statement,实际上它包含了更多的连接:
var resultQuery = from t1 in ctx.Table1.AsNoTracking()
join t2 in ctx.Table2 on new
{
//works for application, but not in Unit-Test, firstMonday is a predefined DateTime-variable
z3 = (int)EntityFunctions.DiffDays(firstMonday, t1.Date)%7,
//works only in Application, but not in Unit-Test
z4 = SqlFunctions.DatePart("wk", t2.Date)
} equals new
{
z3 = (int)t2.Day,
z4 = SqlFunctions.DatePart("wk", t2.BeginDate)
} into tGroup
from x in tGroup.DefaultIfEmpty()
where
[...]
//Class DataTransferObjekt defined to hold attributes of both tables
select new DataTransferObject
{
Id = t1.Id,
Date = t1.Date,
[...]
T2Id = t2.ID
};
我做了很多尝试并做了很多研究。我在这里找到的最佳方法: EntityFunctions.TruncateTime and unit tests
但我无法将提供的解决方案转移到我的特殊情况,因为我的条件是连接的一部分,并且使用第二个答案中提供的System.Data.Entity.DbFunction的解决方案也不适用于单元测试如前所述。
任何帮助都会受到赞赏,我在Moq和LINQ中仍然很新!